我有这个日志:
Jan 26 01:05:47 server54 kernel: [41s58.6w4335] INPUT:DROP: IN=eth4 OUT= MAC=d3:ss:43:23:23:43 SRC=1.1.1.1 DST=127.0.0.0 LEN=40 TOS=0x00 PREC=0x00 TTL=254 ID=65259 PROTO=TCP SPT=53252 DPT=22 WINDOW=14600 RES=0x00 RST URGP=0
我想要拟合结果,以便它只显示带有时间的 SRC 和 DST 部分,首先显示以下内容:
Jan 26 01:05:47 SRC=1.1.1.1 DST=127.0.0.0
我了解到:
tail -f -n 2 /var/log/kern.log | grep 'INPUT'
但如果我添加第二个 grep,它就不会起作用!我想看到实时结果,所以 tail 应该在那里。
答案1
尝试一下这个是否有效:
sed -E 's/^([0-9a-zA-Z: ]*[0-9]{2}:[0-9]{2}:[0-9]{2}).*(SRC=[0-9.:]+).*(DST=[0-9.:]+).*$/\1 \2 \3/g'
它让我Jan 26 01:05:47 SRC=1.1.1.1 DST=127.0.0.0
正则表达式解释:
^
行首
(
开始捕获组 \1
[0-9a-zA-Z: ]*
零个或多个字母数字/冒号/空格
[0-9]{2}:[0-9]{2}:[0-9]{2}
日期(nn:nn:nn)
)
结束捕获组 \1
.*
所有字符
(
开始捕获组 \2
SRC=[0-9.:]+
SRC= 后跟一个或多个数字/冒号/点
)
结束捕获组 \2
.*
任意字符
(
开始捕获组 \3
DST=[0-9.:]+
DST= 后跟一个或多个数字/冒号/点
)
结束捕获组 \3
.*
任意字符
$
行尾
然后我们只需使用sed
(-E
扩展正则表达式)将文件中的每一行替换为三个捕获组(\1 \2 \3)
可能有更短的正则表达式可以做到这一点。
答案2
接受的答案是正确的,但如果你想让它更有趣,你可以这样做:
red=$(tput bold;tput setaf 1)
yellow=$(tput bold;tput setaf 3)
green=$(tput bold;tput setaf 2)
magenta=$(tput bold;tput setaf 5)
normal=$(tput sgr0)
tail -f -n 30 /var/log/kern.log | grep "DROP"|sed -E "s/^([0-9a-zA-Z: ]+)([0-9]{2}:[0-9]{2}:[0-9]{2}).*(SRC=)([0-9.:]+).*$/$yellow\1$red \2$green \3$magenta\4/g"
它将为输出着色,并且不要忘记使用双引号代替单引号。