使用sed从日志中提取某些信息

时间:2013-07-27 20:33:15

标签: linux sed text-processing

我有这个日志,我想从中提取信息。我想用sed来提取它。

Nov 12 19:56:52 libra kernel: [ 1353.27355] WarningIN=em0 OUT=eth0 MAC=c8:1b:3c:fd:5D:e9:90:a9:8F:43:83:E3:15:0e SRC=222.171.89.16 DST=49.137.111.136 LEN=222 TOS=0x8C PREC=0xbF TTL=107 ID=31469 PROTO=ICMP TYPE=35 CODE=8 ID=24917 SEQ=166

19:56:52 12 Nov;Warning;em0;eth0;222.171.89.16;49.137.111.136;ICMP;;

我对sed的理解有困难。 如果有人能在这里纠正我,这将是伟大的。 我想先得到约会,所以我写了

$ sed 's/\([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/' file.log

但我的输出是

Nov 12 19:56:52

我不明白为什么我不只是得到19:56:52

3 个答案:

答案 0 :(得分:1)

使用此模式:

sed -r 's/(^.*\s)([0-9][0-9][:][0-9][0-9]:[0-9][0-9])(.*$)/\2/'

以下是一个例子:

echo "Nov 12 19:56:52 libra kernel" | sed -r 's/(^.*\s)([0-9][0-9][:][0-9][0-9]:[0-9][0-9])(.*$)/\2/'

=> 19:56:52

如果您只想使用sed打印所有文件内容,则可以使用:

sed r FILE

如果你想让sed像grep那样行事:

sed -n '/regexp/p' FILE          # method 1
sed '/regexp/!d'   FILE          # method 2

或者,如果您希望它像grep -v

那样行事
sed -n '/regexp/!p' FILE         # method 1, corresponds to above
sed '/regexp/d'     FILE         # method 2, simpler syntax

你也可以找到一大堆sed one-liners here(事实上,上面的grep示例来自这里链接的网页 - 除了我添加了FILE每个它们)

答案 1 :(得分:1)

简单地说,您不只是获得19:56:52,因为您的模式与Nov 12不匹配。

如果您将.*添加到模式的开头以匹配Nov 12,它将按预期工作。这是更正的命令:

$ sed 's/.*\([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/' file.log

答案 2 :(得分:1)

sed -n 's/\([[:alpha:]]\{3\}[[:blank:]]\{1,\}[0-9]\{1,2\}\)\{0,1\}[[:blank:]]\{1,\}\([0-9]\{1,2\}:}[0-9]\{1,2\}:}[0-9]\{1,2\}\).*/\2/p' YourFile

第一个小时if(其中一个案例)

  • 是以日期格式(11月12日)开始行
  • 的月/日之后
  • 在行
  • 之后的空格(如果有)之后

并打印

小时是否在其他地方或其他模板(并且不打印线)