В оболочке я использую awk, когда мне нужен определенный столбец.
Это напечатает столбец 9, например:
... | awk '{print $9}'
Как мне сказать awk печатать все столбцы, включая столбец 9 и после него , а не только столбец 9?
В оболочке я использую awk, когда мне нужен определенный столбец.
Это напечатает столбец 9, например:
... | awk '{print $9}'
Как мне сказать awk печатать все столбцы, включая столбец 9 и после него , а не только столбец 9?
Ответы:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
или perl
для этого. Используйте это, только если вы действительно настаиваете на его использовании awk
.
Когда вы хотите выполнить ряд полей, у awk
вас действительно нет простого способа сделать это. cut
Вместо этого я бы порекомендовал :
cut -d' ' -f 9- ./infile
Добавлен разделитель полей пробела, поскольку по умолчанию это вкладка. Спасибо Гленну за указание на это
find . | xargs ls -l | cut -d' ' -f 9-
. Почему-то учитываются и двойные пробелы. Пример: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
результат./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Изменить : обратите внимание, это не работает, если какое-либо поле до девятого содержит то же значение, что и девятое.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Вместо того, чтобы иметь дело с пробелами переменной ширины, замените все пробелы одним пробелом. Затем используйте простой cut
с интересующими полями.
Он не использует awk, поэтому не уместен, но казался подходящим с учетом других ответов / комментариев.
ps faux |
использования. Никогда не бойтесь признать инструмент XYZ не самым подходящим.
Обычно perl заменяет awk / sed / grep et. др., и он гораздо более портативный (а также лучший перочинный нож).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi, конечно, подает заявку.
-l
или добавить \n
в оператор печати.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Это обрезает то, что находится перед заданным номером поля, N, и печатает всю остальную часть строки, включая поле номер N и сохраняя исходный интервал (он не переформатируется). Не имеет значения, появляется ли строка поля также где-то еще в строке, что является проблемой с ответом Ашерера.
Определите функцию:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
И используйте это так:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Вывод поддерживает все, включая конечные пробелы. Для N = 0 он возвращает всю строку как есть, а для n> NF - пустую строку.
Вот пример ls -l
вывода:
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
Мое решение для печати всего поста $9
-awk '{print substr($0, 61, 50)}'
Чтобы отобразить первые 3 поля и распечатать оставшиеся поля, вы можете использовать:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
где $ 1 $ 2 $ 3 - первые 3 поля.
Использование cut вместо awk и решение проблем с определением, с какого столбца начинать, с помощью команды -c character cut.
Здесь я говорю, дайте мне все, кроме первых 49 символов вывода.
ls -l /some/path/*/* | cut -c 50-
В /*/*/
конце команды ls говорится, что покажите мне, что находится в подкаталогах.
Вы также можете вытащить определенные диапазоны символов ala (из вырезанной страницы руководства). Например, показать имена и время входа в систему пользователей, вошедших в систему в данный момент:
who | cut -c 1-16,26-38