Сопоставление динамических шаблонов с различными файлами в Unix - PullRequest
1 голос
/ 05 января 2012

Мне нужно извлечь несколько шаблонов из текстового файла, который постоянно обновляется процессом.

Так что я бы сделал:

tail -f file1.txt | egrep --line-buffered 'pattern' | tee pattern.txt

Моя проблема заключается в том, что эти шаблоны должны бытьдинамически взят из файла.Т.е.:

file1.txt:
2012-01-05 21:32:41    server1    some_text
2012-01-05 21:42:51    server1    some_text
2012-01-05 22:12:43    server2    some_text
2012-01-05 22:32:11    server3    some_text
2012-01-05 22:43:14    server3    some_text
2012-01-05 23:31:21    server2    some_text
2012-01-05 23:42:11    server1    some_text

Теперь мне нужно сопоставить эти строки с тремя отдельными файлами: server1.txt, server2.txt.server3.txt, но «server1», «server2» и «server3» - это шаблоны для grep, которые нужно динамически извлекать из file1.txt.Если затем в file1.txt добавляется новая строка, содержащая «serverx», мне нужно создать файл serverx.txt и перенаправить выход из file1.txt в этот новый файл.

Я думаю, что мне понадобитсякомбинация tail, grep, awk, но я не знаю, с чего начать.

Заранее спасибо!

Fran.

Ответы [ 3 ]

4 голосов
/ 05 января 2012

как насчет:

tail -f file1|awk '/yourPattern/{print $0 >> $3".txt"}'

не проверял, но должен работать.

тогда этот oneliner создаст серверные {1,2,3} .txt 3 файлы на основе вашего примера

2 голосов
/ 05 января 2012

Постоянно отправлять входной файл в файлы «паттернов»:

tail -f file1.txt | 
while read date time server text
do
   echo "$date $time $server $text" | tee -a "$server".txt
done
1 голос
/ 05 января 2012

Если tail -f не является обязательным, вы также можете сделать:

awk '{print $3}' file1.txt | 
  sort -u | 
  while read pattern
  do 
     egrep --line-buffered "$pattern" file1.txt | tee "$pattern".txt
  done
...