Bash

從日誌中搜尋模式

  • September 2, 2014

日誌的格式是這樣的:

Junk Junk Junk : Junk Junk Junk:IP/Port Junk Junk

我想使用搜尋IP並且輸出應該只是該IP/Port日誌文件中每一行的一部分。

我嘗試了所有可能的組合grepcut以及我所知道的所有:D,這可能嗎awkbash還是我必須繼續使用一些日誌解析工具?

**編輯:**請注意格式不完全相同,位置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

引用自:https://unix.stackexchange.com/questions/153270