2015-01-13 3 views
2

Предположим, у меня есть файл с именем data.log.Сохранять количество вхождений в усекающем файле

данных постоянно получает добавляется к нему, которое может содержать 'флаг', и он получает усечены с помощью внешнего сценария:

[13/Jan/2015: 11: 11: 53 +0000] curabitur флаг лациния nibh в feugiat Mollis

хвост: data.log: файл усекается

[13/Jan/2015: 11: 11: 53 +0000] dapibus enim sagittis efficitur

[13/Jan/2015: 11: 11: 54 +0000] iaculis non flag ac urna.

После объявления counter=0, я хочу увеличить его с количеством найденных вхождений. Я придумал что-то вроде этого, который использует wc -l для подсчета строк в data.log содержащей «флаг»:

counter=$(($counter+$(cat data.log | grep s | wc -l))) 
echo $counter 

Теперь осталось только одна проблема: -срезающая. Как я подхожу к этому? Я думал о том, чтобы делать watch, но как я могу взять на усечение события? Или есть другое направление, в котором я должен идти?

+1

Я бы использовал 'awk' – user3159253

+1

Как в стороне,' $ (cat data.log) 'может выполняться исключительно в' bash' как: '$ ( pgl

ответ

1

Это должно работать для вас:

$ tail -F data.log | grep --line-buffered s | while read match ; do ((counter++)) ; done 

-F флаг для tail такой же, как --follow --retry. --retry магия немного здесь:

--retry 
      keep trying to open a file even when it is or becomes inaccessi‐ 
      ble; useful when following by name, i.e., with --follow=name 

Я также использовал --line-buffered с grep, чтобы избежать время цикла необходимости ждать выхода.

Одна из проблем, которые я только что понял: если флаг появляется более чем один раз для каждой строки, $counter по-прежнему будет только увеличиваться на 1. Но этот вопрос находится в вашем решении, а также.

+0

Awesome. Отличное решение и выглядит хорошо. Большое спасибо! –

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