日志的格式如下:
Junk Junk Junk : Junk Junk Junk:IP/Port Junk Junk
我想使用进行搜索IP
,输出应该只是IP/Port
该日志文件中每行的一部分。
我尝试了所有可能的组合grep
,cut
以及我awk
所知道的一切bash
:D 那么这可能吗?或者我必须继续使用一些日志解析工具?
编辑:请注意,格式不完全相同,位置Junk:IP/Port
可能会发生变化,因此无法使用awk '{print $7}'
更新:添加示例日志
DATE NAME-FIREWALL : %RULE-NUM: Teardown TCP connection PKT-NUM for LAN1:X.X.X.X/XX to LAN2:X.X.X.X/XX duration 0:0:0 bytes XXXX TCP FINs
DATE NAME-FIREWALL : %RULE-NUM: Built inbound TCP connection PKT-NUM for LAN1:X.X.X.X/XX (X.X.X.X/XX) to LAN2:X.X.X.X/XX (X.X.X.X/XX)
我需要搜索并获取 LAN2 旁边的 IP/端口部分。
答案1
关于什么
awk '{for(i=1;i<=NF;i++) if ( $i ~ /[^:]*:/ ) { n=split($i,A,":"); if (length(A[2]) && n==2) print A[2] ; }} ' b.txt
X.X.X.X/XX
X.X.X.X/XX
X.X.X.X/XX
X.X.X.X/XX
编辑:(使用局域网)
awk '{for(i=1;i<=NF;i++) if ( $i ~ /[^:]*:/ ) { n=split($i,A,":"); if (length(A[2]) && n==2) printf "%s -- %s\n",A[1], A[2] ; }} ' b.txt
LAN1 -- X.X.X.X/XX
LAN2 -- X.X.X.X/XX
LAN1 -- X.X.X.X/XX
LAN2 -- X.X.X.X/XX
答案2
尝试一下这个:
grep -Po 'LAN2:\K(\d{1,3}.){3}\d{1,3}/\d*' file
这会查找一个块PATTERN:ipdigits.ipdigits.ipdigits.ipdigits/digits
并打印该ipdigits.ipdigits.ipdigits.ipdigits/digits
部分(\K
“清理”匹配)。它表示ipdigits
必须包含 1 到 3 个字符。可以应用更多过滤器(匹配 1 到 255)。
测试
$ cat a
Junk Junk Junk : Junk Junk LAN2:123.123.2.2/56 Junk Junk
Junk Junk Junk : Junk Junk LAN3:22.33.44.55/22 Junk Junk
$ grep -Po 'LAN2:\K(\d{1,3}.){3}\d{1,3}/\d*' a
123.123.2.2/56