如何使用tailf和sed填充并仅查看ip表日志的子字符串?

如何使用tailf和sed填充并仅查看ip表日志的子字符串?

iptable 日志的一行是:

Jan  1 21:41:19 x kernel: [838760.885218] IPTables-Dropped: IN=eth0 OUT= MAC=x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:00:x:00:00:x:00:x:x:x:x SRC=x.x.x.x DST=x.x.x.x LEN=70 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=37739 DPT=53 LEN=50 

为了观看现场直播,我使用了:

tailf /var/log/kern.log

但正如你所看到的,它包含了很多信息。所以我尝试仅查看该行的源字段和目标字段。

我将命令更改为如下所示:

tailf /var/log/kern.log | sed -n -e 's/^.*DST: //p'

但仍然没有,有什么办法可以改变它只显示源和目标IP地址吗?或者我应该采用比命令更复杂的解决方案。

答案1

[...] 尝试仅查看该行的源字段和目标字段。

我会用grep.像这样的东西:

echo "Jan  1 21:41:19 x kernel: [838760.885218] IPTables-Dropped: IN=eth0 OUT= MAC=x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:00:x:00:00:x:00:x:x:x:x SRC=192.168.1.10 DST=192.168.1.20 LEN=70 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=37739 DPT=53 LEN=50" | egrep -o 'SRC=[0-9.]* DST=[0-9.]*'
SRC=192.168.1.10 DST=192.168.1.20

在你的情况下它将变成:

tailf /var/log/kern.log | egrep -o 'SRC=[0-9.]* DST=[0-9.]*'

答案2

从下面的命令找出存在的最大列

awk '{print NF}' /var/log/kern.log/sort -rn | head -1并在 for 循环最大值中分配该值

根据给定的输入,存在的最大列是 22,因此我们在 for 循环中分配了 22 中的值

for ((i=1;i<=22;i++)); do tail -f /var/log/kern.log |awk -v i="$i" '$i ~ "SRC" {print $i}';tail -f /var/log/kern.log | awk -v i="$i" '$i ~ "DST" {print $i}'  ; done

output
SRC=x.x.x.x
DST=x.x.x.x

答案3

你期待什么?该行不包含DST:.使用

sed -n 's/.*\(SRC=.*DST=[^ ]\).*/\1/p'

删除匹配项内的所有内容\(\)

相关内容