Bash
從日誌中搜尋模式
日誌的格式是這樣的:
Junk Junk Junk : Junk Junk Junk:IP/Port Junk Junk
我想使用搜尋
IP
並且輸出應該只是該IP/Port
日誌文件中每一行的一部分。我嘗試了所有可能的組合
grep
,cut
以及我所知道的所有:D,這可能嗎awk
?bash
還是我必須繼續使用一些日誌解析工具?**編輯:**請注意格式不完全相同,位置
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/埠部分。
關於什麼
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
試試這個:
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