Awk

查找文件中不包括本地 IP 的 IP 地址

  • February 28, 2021

任務:從包含任何 (IPv4) IP 地址的文件中查找並列印行,但本地 LAN 上的 IP 地址除外(本地 LAN 使用 192.168.1.x 種類的 C 類地址)。我(從各種線上搜尋中獲取了一些資訊)使用sed和幾個管道來相當有效地做到這一點,如下所示:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' logfile.txt | sed '/192\.168\.[[:digit:]]\.[[:digit:]]\{,3\}/d'

問題:是否有其他或更好的方法可以使用替代實用程序來做到這一點,或者我可以對我提出的咒語進行改進?

背景:目的是,在非 systemd(Void Linux)系統上,每天搜尋一個包含 ssh 連接資訊的系統日誌文件,以查看除了我本地 LAN 上的主機之外,誰一直在嘗試進行 ssh 連接/查詢. 每天使用 生成包含目標資訊的文件svlogtail,然後執行上述命令。然後系統將輸出通過電子郵件發送給我。

樣本輸入數據

2020-06-21T08:28:04.56472 auth.err: sshd[21813]: error: Bind to port 22 on 192.168.2.16 failed: Cannot assign requested address.  
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format  
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format  
2020-09-06T15:25:19.32385 auth.info: Sep  6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format  
2021-01-30T16:03:43.39251 auth.info: Jan 30 10:03:43 sshd[32208]: rexec line 80: Unsupported option GSSAPIAuthentication  
2021-02-05T12:24:30.42762 auth.info: Feb  5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format  
2021-02-19T15:48:10.29592 auth.info: Feb 19 09:48:10 sshd[2924]: Disconnected from user 192.168.1.10 port 33732

所需的輸出(這個可接受的輸出是我在執行上述sed命令後得到的)

2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format  
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format  
2020-09-06T15:25:19.32385 auth.info: Sep  6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format  
2021-02-05T12:24:30.42762 auth.info: Feb  5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

稍後總結做這種事情的最優雅的方式肯定是grepcidr. 如果我在嘗試完成這項任務之前就知道它,我肯定會使用它。我將標記建議將其用作答案的響應,即使有多種方法(包括sed我發布的命令和管道)來實現相同的目標。該命令確實對這些類型的任務具有更大的適應性,因為與嘗試使用orgrepcidr相比,可以更容易地指定多個地址範圍。sed``grep

順便說一句,我還發現了幾個grep命令,當它們一起使用管道時,也會給出相同的結果,如下所示:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' logfile.txt | grep -v 192.168.[[:digit:]].[[:digit:]]

您似乎想過濾掉192.168.0.0/16塊中包含地址的行。你可以這樣做grepcidr

$ grepcidr -v '192.168.0.0/16' file
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format
2020-09-06T15:25:19.32385 auth.info: Sep 6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format
2021-02-05T12:24:30.42762 auth.info: Feb 5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

或者,如果您想使用特定範圍,例如“在 192.168.1.0 和 192.168.2.255 之間”:

$ grepcidr -v '192.168.1.0-192.168.2.255' file
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format
2020-09-06T15:25:19.32385 auth.info: Sep 6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format
2021-02-05T12:24:30.42762 auth.info: Feb 5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

要過濾掉所有私有 IPv4 塊,請使用

grepcidr -v '10.0.0.0/8,172.16.0.0/12,192.168.0.0/16' file

grepcidr應該也懂 IPv6,不過既然不懂,就不舉個例子了。

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