![如何使用tailf和sed填充并仅查看ip表日志的子字符串?](https://linux22.com/image/125006/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8tailf%E5%92%8Csed%E5%A1%AB%E5%85%85%E5%B9%B6%E4%BB%85%E6%9F%A5%E7%9C%8Bip%E8%A1%A8%E6%97%A5%E5%BF%97%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
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'
删除匹配项内的所有内容\(\)