Чи можна фільтрувати вихід хвоста?


11

Мені хотілося б передати файл, але тільки рядки виводу, які містять певний рядок. Чи можливо це?

Відповіді:


32

використовувати греп. Його побудували саме для цієї мети.

Щоб знайти рядки з хвоста / var / log / syslog, у яких "cron", просто запустіть:

tail -f /var/log/syslog | grep cron

А оскільки він приймає що-небудь понад stdin, ви можете використовувати його і на виході будь-якої іншої команди, прокладаючи так само, як вище (використовуючи символ |).


8
Хоча це по суті правильно, важливо усвідомити, що grepбуде буфер, коли він використовується неінтерактивно, наприклад, коли він є частиною більш тривалого трубопроводу. GNU grep 2.5.1 пропонує --line-bufferedможливість вирішити це питання, коли усунення грепа з конвеєра не є варіантом. (Коли я кажу, що grep буде буферним, я маю на увазі, що ви не побачите вихід, поки буфер не досягне чогось на зразок 4k.)
kojiro

Щоб доповнити попередній коментар, "tail -f" під сучасним Linux працюватиме в циклі, чекаючи додаткового введення у файл syslog. Щоб команда фактично закінчила наявний вміст файлу, опустіть перемикач -f: tail / var / log / syslog | grep cron
Gnudiff

7
tail -f /var/log/messages | grep "myfilterword"

Сподіваюся, що це допомагає.


4

Ось ще кілька ідей, які, хоча і не так просто, можуть запропонувати додаткову цікаву гнучкість:

По-перше, ви можете фільтрувати з 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.


+1 чудова розробка про те, як розширитись далі ніж grep!
пабло

2

Ще один трюк, який варто зазначити, якщо у вас є файл 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перший рядок опустіть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.