仅解析有 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

相关内容