Command-Line

從特定列中刪除包含 IP 範圍的行,同時對范圍進行排除

  • July 13, 2016

我有一個格式如下的日誌文件:

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
$ 

所有這些行都按原樣刪除。

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