僅解析有 9 個句點的行

僅解析有 9 個句點的行

我從 13.5 TB 中提取了 90 GB 資料。

我嘗試過從sort -u | uniq13.5T 系統日誌資料中 awk 處理的資料。

一些格式錯誤的資料很明顯,所以我用 awk 和“seen”重新運行解析,如下所示:

 awk -F, '!seen[$1]++' inputfile > outputfile

事實證明,這是最省時的方法,但也包括一些格式錯誤的資料……也許存在格式錯誤的日誌條目,或者在排序 uniq'ing 和 awk'ing 時,某些行被破壞了。我不在乎是否有更多/更好的方法來解析原始數據,因為我有足夠大的樣本量 - 這意味著在 13.5T 中丟失一點數據是可以的。

每條有效線路有 3 個 IP 位址。

由於 IP 位址中有 3 個句點,因此我需要一些能夠僅解析出包含 9 個「.」的行的東西。

答案1

讓我們將此作為測試文件:

$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep
1.2.3.4 5.6.7.8 9.10.11     Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period

使用 grep

要選出剛好有九個句點的行:

$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

[^.]*\.匹配任意數量的非句點字符,後面跟著 a([^.]*\.){9}正好匹配九個由零個或多個非句點字符組成的序列,後跟句點。開頭^要求正規表示式從行首開始符合。這[^.]*$意味著,在九個序列的末尾和行的末尾之間,只允許使用非句點字元。

使用 sed

$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

-n選項告訴 sed 不要列印,除非我們明確要求它列印。以下p正規表示式明確要求 sed 列印與正規表示式相符的那些行。

使用 awk

$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

或者,使用 awk 定義字元來分隔欄位的功能(技巧:傑夫·夏勒):

$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

相關內容