2017-02-23 77 views
0

我想搜索带有时间戳线在日志文件中(不是所有的线路有时间戳),我也想保持这些时间戳,以我看到的时间跨度中,忙碌了一天号等grep的匹配行一个文件,匹配的字符串到另一个文件

201 3083560 2013-10-21T13:57:55.334+0200 time|bootup 
202 3083560 2013-10-21T13:57:55.334+0200 startup 
204 3083579 2013-10-21T13:57:55.353+0200 system|device 
205 3083579 2013-10-21T13:57:55.353+0200 system|manufacturer 
206 3083579 2013-10-21T13:57:55.353+0200 system|model 

我可以运行命令:

grep -P '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file1.txt 
grep -Po '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file2.txt 

我的问题是,我可以运行的grep一次得到我需要一些管道?模式保持不变,所以我猜grep一次可以节省一些时间,因为我有30k个人用户日志文件。

*将标签保留在图案末端很有用,因为在某些行中最后一列有时间值,所以我需要排除\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\n

*我的环境是CentOS的7,grep的(GNU)2.20。

非常感谢!

+0

您不必两次运行它,你可以在'usr.log'直接使用'grep的-oP'。 。 – Inian

+0

另外您正则表达式'\ d {4} - \ d {2} - \ d {2}Ť\ d {2}:\ d {2} \ d {2} \ \ d {3} [+ - ] \ d {4} \ t'或\ d {4} - \ d {2} - \ d {2} T \ d {2}:\ d {2} \ d {2}。\ d {3} [+ - ] \ d {4} \ n'与示例输入文件中的行不匹配 – Inian

+0

谢谢!我忘了额外的:在模式中。现在我已经修复了它。但是如何在一次运行中完成呢?我也想保留file1.txt。 – leoce

回答

0

我不认为这可以通过一个grep做,但你可以使用一次读取文件和重用grep的输出脱身,如果你的grep一个的输出发送到其他:

regex='\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' 
grep -P "$regex" usr.log | tee file1.txt | grep -Po "$regex" > file2.txt 

tee file保存输入到该文件,并打印到stdout以及,使得它有用保存输出在管道的中间。

如果你可以使用awk,那么你可以利用它是第三场,并做到在一个运行:

awk '/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}.[0-9]{4}\t/ \ 
    {print $3 > "file2.txt"; print}' usr.log > file1.txt 
0

如果您在Perl中运行你的正则表达式可以拆分标准输出之间的输出和stderr使用$&变量只打印匹配的字符串:

perl -ne 'if(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}/){print; print STDERR "$&\n"}' usr.log > file1.txt 2> file2.txt 
相关问题