Мені хотілося б передати файл, але тільки рядки виводу, які містять певний рядок. Чи можливо це?
Мені хотілося б передати файл, але тільки рядки виводу, які містять певний рядок. Чи можливо це?
Відповіді:
використовувати греп. Його побудували саме для цієї мети.
Щоб знайти рядки з хвоста / var / log / syslog, у яких "cron", просто запустіть:
tail -f /var/log/syslog | grep cron
А оскільки він приймає що-небудь понад stdin, ви можете використовувати його і на виході будь-якої іншої команди, прокладаючи так само, як вище (використовуючи символ |).
Ось ще кілька ідей, які, хоча і не так просто, можуть запропонувати додаткову цікаву гнучкість:
По-перше, ви можете фільтрувати з awk замість grep:
tail -f /var/log/messages | awk '/myfilterword/'
що працює точно так само, як у прикладі grep
. Ви можете розширити це за допомогою сили awk, наприклад:
tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'
яке буде надрукувати 6-е по останньому полі виводу (поля розділені пробілом)
Ще одна подібна ідея полягає у використанні однолінійного Perl:
tail -f /var/log/messages | perl -ne "/myfilterword/ and print"
що працює точно так само grep
. Можливо, ви хочете лічильник номера рядка і лише 6-е поле? Як щодо цього:
tail -f /var/log/messages | \
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"
Очевидно, що всі ці речі можна зробити і за допомогою інших інструментів, але я хотів проілюструвати, що тут є кілька цікавих способів використання більш загальних мов, таких як awk або perl.
Ще один трюк, який варто зазначити, якщо у вас є файл CSV із заголовками, які ви хочете опустити, наприклад:
% cat data.txt
fruit dessert calories
Apple Pie 770
Banana Pudding 625
Cherry Cobbler 990
% tail -n +2 data.txt
Apple Pie 770
Banana Pudding 625
Cherry Cobbler 990
Не має значення, наскільки тривалий вхід tail
, +n -2
перший рядок опустіть.
grep
буде буфер, коли він використовується неінтерактивно, наприклад, коли він є частиною більш тривалого трубопроводу. GNU grep 2.5.1 пропонує--line-buffered
можливість вирішити це питання, коли усунення грепа з конвеєра не є варіантом. (Коли я кажу, що grep буде буферним, я маю на увазі, що ви не побачите вихід, поки буфер не досягне чогось на зразок 4k.)