使用正则表达式提取子字符串

问题描述 投票:0回答:4

我想从我的日志文件中提取从

<
到下一个

$>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

正则表达式是什么样的?

regex sed awk
4个回答
2
投票

我不会创建一个不可读的正则表达式来执行此操作,我会在这里使用

awk

$ awk -F'[< ]' '/^[0-9]+/{s?s=s"|"$4:s=s$4}END{print s}' file
F280|F281|F280|F281

为了使脚本更具可读性:

/^[0-9]+/ {
    s ? s = s "|" $4
      : s = s $4 }
END {print s}

1
投票

试试这个:

sed -n'/
    

尝试类似的方法(您将有嵌套组),或者在正则表达式中打开多行选项:

(^.+<(\w+) .+$)+

是否必须只使用 grep 还是还有其他命令可用? 我想说的是

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

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

F280|
F281|
F280|
F281|

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


0
投票

尝试类似的方法(您将有嵌套组),或者在正则表达式中打开多行选项:

(^.+<(\w+) .+$)+

0
投票

是否必须只使用 grep 还是还有其他命令可用? 我想说的是

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

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

F280|
F281|
F280|
F281|

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

© www.soinside.com 2019 - 2024. All rights reserved.