Command-Line
從特定列中刪除包含 IP 範圍的行,同時對范圍進行排除
我有一個格式如下的日誌文件:
Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"
我需要刪除所有包含 192.168.xx 範圍內 IP 的行,但前提是它們出現在第 4 列中。
我還需要從 192.168.xx 範圍中排除 3 個 IP。讓我們稱這些
192.168.125.100 192.168.126.100 192.168.155.240
如何完成此命令以在第 4 列中查找 192.168.xx 範圍內的所有 IP,並刪除除包含 192.168.125.100、192.168.126.100 和 192.168.155.240 的行之外的所有行。
awk '{print $4}' file | grep '192.168' | "remove all found except" | > save back to original file
嘗試:
awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
例子
考慮這個測試文件:
$ cat file Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101" Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101" Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101" Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101" Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"
據我了解您的規則,您希望保留除第一行之外的所有內容。
$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101" Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101" Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101" Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"
多行版本
對於那些喜歡他們的程式碼分佈在多行的人:
awk ' { f=1 } $4 ~ /^192.168/ { f=0 } $4 ~ /192.168.(125.100|126.100|155.240)/ { f=1 } f ' file
這個怎麼運作
該程式碼使用單個變數
f
。如果應該保留一行,我們設置f=1
. 否則,f
設置為零。
f=1
首先,假設應該保留該行。
$4 ~ /^192.168/{f=0}
如果
$4
以 開頭192.168
,則將該行標記為我們應該失去的行。
$4 ~ /192.168.(125.100|126.100|155.240)/{f=1}
對於這三種特殊情況,將該行標記為 keeper:
f=1
。
f
這是 awk 的神秘簡寫:如果
f
為真(非零),則列印該行。附加測試
根據評論,我們將嘗試 file2:
$ cat file2 Jul 13 21:47:41 192.168.100.125 "user from 192.168.100.101" Jul 13 21:47:41 192.168.202.150 "user from 192.168.100.101" Jul 13 21:47:41 192.168.101.45 "user from 192.168.100.101"
現在,讓我們執行我們的命令:
$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2 $
所有這些行都按原樣刪除。