Я пишу follwoing awk сценарий:
% echo /var/sysconfig/network/my_functions alpha beta gama | \
awk -v word=alpha '$2 == word { print $0 }'
как сказать awk, что я хочу распечатать всю строку кроме 1$ (/var/sysconfig/network/my_functions ПУТЬ), таким образом, я получу следующее:
alpha beta gama
вместо
/var/sysconfig/network/my_functions alpha beta gama
комментарий: содержание строки может быть чем-либо и не ограничить количеством строк/слова
Я думаю в awk нет никакого пути, кроме как удалить первое поле вручную. (Существуют другие пути, если Вы готовы нормализовать межполевое пространство.)
awk '$2 == word {match($0, "("FS")+"); print substr($0, RSTART+RLENGTH);}'
Если Вы устанавливаете $1
кому: ""
Вы оставите пространство разграничивания. Если Вы не хотите делать это, необходимо выполнить итерации по полям:
awk '{for (f=2; f<=NF; ++f) { if (f!=2) {printf("%s",OFS);} printf("%s",$f)}; printf "\n" }'
Править: зафиксированный на комментарий Gilles.
Другой способ сделать то же самое:
awk '{d = ""; for (f=2; f<=NF; ++f) {printf("%s%s", d, $f); d = OFS}; printf("\n") }'
Так или иначе я думаю, что это было бы настолько легче и более интуитивным, чтобы сделать с командой сокращения:
echo /var/sysconfig/network/my_functions alpha beta gama | cut -d' ' -f 2-
Единственная проблема состоит в том, что сокращение не поддерживает несколько различных типов пробела сразу для разделителей. Таким образом, если у Вас будут пробелы или вкладки, то это не будет работать.