На оболонці я трублюся до 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]"'
Тімтовтді застосовується, звичайно.
-l
або додати \n
до оператора друку.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Це рубає те, що перед даним полем nr., N, і друкує всю решту рядка, включаючи поле nr.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 поля.
Використання вирізання замість awk та подолання проблем із з’ясуванням, з якого стовпця починати, за допомогою команди -c вирізання символів.
Тут я кажу: дайте мені всі, крім перших 49 символів результату.
ls -l /some/path/*/* | cut -c 50-
У /*/*/
кінці команди ls сказано показати мені, що теж є в підкаталогах.
Ви також можете витягнути певні діапазони символів ala (зі сторінки вирізаного керівника). Наприклад, покажіть імена та час входу користувачів, які зараз ввійшли до системи:
who | cut -c 1-16,26-38