2013-05-01 3 views
7

Я запускаю веб-сайт, и я хотел настроить однострочный файл Bash, поэтому, когда кто-то попадает на сайт, он будет издавать звуковой сигнал с помощью внутреннего зуммера ,'tail -f' не дает одиночных строк при прохождении через grep '

Пока он работает, используя следующее.

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

Хвоста следует access_log и отвалы на STDOUT, получить STDOUT линии в то время, эхо строки с «\ 007» «внутренний гудком шестнадцатеричного кода», и сделано ...

Это работает как красота ... Каждое попадание показывает линию из журнала и звуковые сигналы ... Тем не менее, это очень раздражало, поэтому в идеале я хотел отфильтровать tail -f /access/log, прежде чем он попадет в while, так что только чтение получает строки, о которых я забочусь. Я думал grep "/index.php" будет хорошим показателем посетителей ...

Это где проблема ...

я могу сделать ...

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

подает звуковой сигнал на все и я может сделать ...

tail -f access_log | grep "/index.php" 

и страницы отображаются без какого-либо звукового сигнала, но когда я делаю

tail -f access_log | grep "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

Ничего не происходит, нет строки из журнала, нет звукового сигнала.

Я думаю, что grep что-то испортил, но я не могу понять, где. Мне бы хотелось, чтобы это был один лайнер, и я знаю, что это действительно должно быть сделано в скрипте, и было бы проще, но это не объясняет, почему выше, что, я думаю, должно работать, нет.

+0

вы можете предоставить код журнала образец для нас, чтобы посмотреть и возиться с? – Ding

+0

, к сожалению, нет ... его пронизано конфиденциальной информацией ... вы можете использовать любой access_log и просто выбрать один url для grep for. –

+0

его довольно приятная функция, звук (смесь звуковых сигналов) из одной загрузки веб-страницы может выдавать около 20-30 звуковых сигналов (строки в журнале) ... звуковой сигнал означает, что вы можете сразу сказать, в какой момент файлы обслуживаются ... –

ответ

14

Выход Grep буферизуется, когда он используется в трубе. Используйте --line-buffered, чтобы заставить его использовать буферизацию строк, чтобы он сразу выводил строки.

tail -f access_log | grep --line-buffered "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

Вы можете также комбинировать grep и while петлю в один awk вызова:

tail -f access_log | awk '/\/index.php/ { print "\007" $0 }' 
+0

Люблю тебя ... Работал как шарм :) –

+1

теперь ваш показ ... будет ... никогда не попасть в awk, но швы, чтобы получить меня из неприятностей много, может быть, время, чтобы дать странице человека хорошее чтение ... еще раз спасибо ... –

7

Буфер Grep выводится, когда стандартный выход не является терминалом. Вам нужно передать переключатель --line-buffered в grep, чтобы заставить его очищать стандартный вывод всякий раз, когда он пишет строку.

+0

Люблю тебя ... Работал как шарм :) –

Смежные вопросы