1

我想从我的日志文件中提取<到下一个。

$>cat messages.log
2013-03-24 19:32:37.231 <F280 [192.168.178.22]:5000 -- Unknown>, Msg:[Test1]
2013-03-24 19:32:37.547 <F281 [192.168.178.22]:5000 -- Unknown>, Msg:[Test2
Test3
Test4]
2013-03-24 19:32:38.833 <F280 [192.168.178.22]:5000 -- Unknown>, Msg:[Test5]
2013-03-24 19:32:42.222 <F281 [192.168.178.22]:5000 -- Unknown>, Msg:[Test6]
$>sed 's/.*\<\(.*\) \[.*/\1|/g' messages.log
F280|
F281|
Test3
Test4]
F280|
F281|

除了换行符的输出外,我几乎得到了我想要的东西。所以我想得到以下结果:

F280|F281|F280|F281

正则表达式的外观如何?

4

4 回答 4

2

我不会创建一个不可读的正则表达式来做到这一点,我会awk在这里使用:

$ awk -F'[< ]' '/^[0-9]+/{s?s=s"|"$4:s=s$4}END{print s}' file
F280|F281|F280|F281
于 2013-03-28T11:02:58.453 回答
1

试试这个:

sed -n '/</{s/^.*<\([^]\+\) .*$/\1|/g;H;${x;s/\n//g;s/| $//;p}}'messages.log
于 2013-03-28T11:01:06.540 回答
0

尝试类似的事情(你会有嵌套组),或者在正则表达式中打开多行选项:

(^.+<(\w+) .+$)+
于 2013-03-28T11:02:52.030 回答
0

是否必须仅使用 grep 或其他命令可用?我想说的是

grep "<.* " messages.log | sed  's/.*\<\(.*\) \[.*/\1|/g' | tr -d '\n' | sed 's/.$//'

第一个 grep 是删除不符合您所需模式的数据,然后是您的 sed 命令。在输出上,谁应该看起来像

F280|
F281|
F280|
F281|

最后一个 tr 命令只是删除每行末尾的换行符(即它连接结果),而最后一个 sed 只是删除最后的管道分隔符

于 2013-03-28T11:06:13.770 回答