2009-07-08 3 views
2

Я пишу сценарий оболочки, чтобы сделать «хвост» в растущем файле журнала. Этот скрипт принимает параметры для поиска и пошагово выводит на них результат.Строка строк grep динамически

Например, если сценарий вызывается следующим образом:

logs.sh string1 string2 

он должен перевести:

tail -f logs.txt | grep string1 | grep string2 

Я строю список Grep строк, как это:

full_grep_string="" 
for grep_string in $* 
do 
    full_grep_string="$full_grep_string | grep $grep_string" 
done 

Строка построена правильно, но когда я пытаюсь, наконец, пометить ее командой хвоста, вот так ...

tail -f $LOG_FILE_PATH $full_grep_string 

... grep не применяется, и я получаю нефильтрованные журналы.

Я что-то упустил? Или есть более простой способ сделать это?

+0

Просто небольшое уточнение: Есть идея, что ваш сценарий должен выводить строки из файла журнала, который содержит ОБА string1 и string2, или было ваше намерение найти строки, содержащие любую строку? –

+0

Кроме того, какую оболочку вы используете? Баш? –

+0

для меня на debian lenny Мне приходится сталкиваться с проблемой, что два комбинированных grep не работают с хвостом -f, но только с хвостом – tuergeist

ответ

2
eval tail -f $LOG_FILE_PATH $full_grep_string 
+0

Это сработало! Благодаря! :) –

1

grep буферизует найденную линию. Поэтому изменение вашего кода на

full_grep_string="$full_grep_string | grep --line-buffered $grep_string" 

должно работать. Я тестировал его на debian lenny (с bash).

И использовать кончик an0

eval tail -f ... 

(Все это работает для целых слов)

+0

Спасибо за подсказку .. но похоже, что моя версия grep слишком старая, чтобы принимать аргументы полного слова. Я тестирую коробку SunOS 5.8, кстати. Очень старое программное обеспечение. :) –