4

我有这个日志,我想从中提取信息。我想用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

4

3 回答 3

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

如果(其中一种情况)花第一个小时

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

并打印出来

不花一小时在其他地方或使用其他模板(并且不要打印该行)

于 2013-12-11T15:36:32.850 回答
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 单行代码(事实上,上面的 grep 示例取自此处链接的网页——除了我添加了FILE每个)

于 2013-07-30T22:16:46.293 回答
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
于 2013-07-31T02:33:49.440 回答