Roc*_*cco 11 grep sed text-processing text-formatting
我有一个很长的文本文件(从这里开始),它应该包含 6 个十六进制字符,然后是一个“中断”(它显示为一个字符,似乎没有在下面的代码降价中正确显示),然后是几个单词:
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
5080 Cisco Systems, Inc
0E+00 ASUSTek COMPUTER INC.
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
2354 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
Run Code Online (Sandbox Code Playgroud)
我已经环顾四周,但看不到在这种情况下可以工作的东西。我的问题是,我该如何使用grep/ sed/ awk/perl删除不与刚好6个十六进制字符,然后一个“破”启动这个文本文件中的所有行?
PS 对于加分,根据十六进制字符(即000000-> FFFFFF)按字母顺序和数字顺序对文件进行排序的最佳方法是什么?我应该使用sort吗?
Kus*_*nda 13
$ awk '$1 ~ /^[[:xdigit:]]{6}$/' file
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
Run Code Online (Sandbox Code Playgroud)
这用于awk提取第一个字段中恰好包含六个十六进制数字的行。该[[:xdigit:]]模式匹配一个十六进制数字,并且{6}需要其中的六个。加上锚定到外地的开始和结束与^和$分别,这只会匹配想行上。
重定向到某个文件以将其保存在新名称下。
请注意,这似乎适用于 GNU awk(通常在 Linux 上找到),但不适awk用于例如 OpenBSD 或mawk.
类似的方法sed:
$ sed -n '/^[[:xdigit:]]\{6\}\>/p' file
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
Run Code Online (Sandbox Code Playgroud)
在这个表达式中,\>用于匹配十六进制数的结尾。这可确保不匹配更长的数字。该\>模式匹配单词边界,即单词字符和非单词字符之间的零宽度空间。
要对结果数据进行排序,只需将结果通过管道传输,sort或者sort -f如果您的十六进制数字同时使用大写和小写字母
为了完整起见,您也可以使用 grep 执行此操作:
$ grep -E '^[[:xdigit:]]{6}\b' oui.txt
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
$
Run Code Online (Sandbox Code Playgroud)
这个扩展的 grep 表达式在每行的开头搜索 6 个十六进制数字,紧接着是一个非空白到空白的边界 ( \b)。