2012-01-05 125 views
1

我需要从一个文本文件中grep几个模式,这个文本文件由进程不断更新。在Unix上将动态模式粘贴到不同的文件上

所以我会做:

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

我的问题是,这些模式需要从文件dinamically拍摄。即:

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 

现在我需要将这些行grep到三个分离的文件:server1.txt,server2.txt。 server3.txt,但“server1”,“server2”和“server3”是grep的模式,需要从file1.txt中以dinam取消。如果包含“serverx”的新行被添加到file1.txt中,我需要创建一个serverx.txt文件,并将file1.txt的输出重定向到这个新文件。

我想我需要tail,grep,awk的组合,但我不知道如何开始。

在此先感谢!

Fran。

+0

从哪里开始? Perl,http://www.perl.org/ :) – zrvan 2012-01-05 13:20:38

回答

4

怎么样:

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

没有测试,但应该工作。

那么这oneliner会根据您的例子创建服务器{1,2,3} .TXT 3个文件

+0

哇......那很快!谢谢你跟我分享你的知识! – Fracu 2012-01-05 15:30:10

2

输入文件连续分派到 “模式” 文件:

tail -f file1.txt | 
while read date time server text 
do 
    echo "$date $time $server $text" | tee -a "$server".txt 
done 
+0

@Francisco它是你想要的吗? – olibre 2012-01-05 13:56:07

+0

谢谢oHessling!我会试一试。然而,肯特的打线员按我的预期工作。 – Fracu 2012-01-05 15:32:07

1

如果tail -f不是madatory,你也可以这样做:

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