![仅解析有 9 个句点的行](https://linux22.com/image/122701/%E4%BB%85%E8%A7%A3%E6%9E%90%E6%9C%89%209%20%E4%B8%AA%E5%8F%A5%E7%82%B9%E7%9A%84%E8%A1%8C.png)
我从 13.5 TB 中提取了 90 GB 数据。
我尝试过从sort -u | uniq
13.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