Трубопровід від grep до awk не працює


34

Я намагаюся вести журнал файлів, grepщо триває, tailі отримати nслово з рядка. Приклад файлу:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

Тепер, якщо я роблю tail:

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

Якщо я grepце tail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

Але якщо я awkце grep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

Нічого, як би довго я не чекав. Я підозрюю, що це пов'язане з тим, як працює потік.

У когось є підказки?

Відповіді:


56

Це, ймовірно, вихідний буфер з grep. ви можете відключити це за допомогою grep --line-buffered.

Але вам не потрібно передавати вихід з grep в awk. awk може зробити схему регулярного вирівнювання, яка відповідає всім самим.

tail -f test.txt | awk '/Beam/ {print $3}'


8

Використання tail -f test.txt | awk '/Beam/{print $3}'творів для мене. А також використання tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Проблема тут полягає в тому, якщо awkдані отримані по черзі або як один більший блок даних. Версія grep GNU надсилає вихід у більші блоки, оскільки вона є більш ефективною, але її awkпотрібно читати по черзі, щоб виводити по черзі.

Ось так: grepвідправлятимуть дані лише тоді, коли буфер буде заповнений, awk очікує заповнення цього буфера, тому він нічого не надсилає.


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