删除分隔符前没有 n 个字符的所有行

删除分隔符前没有 n 个字符的所有行

我有一个很长的文本文件(来自这里)应包含 6 个十六进制字符,然后是一个“break”(它显示为一个字符,并且在下面的代码 markdown 中似乎没有正确显示),后跟几个单词:

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

我环顾四周,看不到在这种情况下可行的东西。我的问题是,如何使用grep///删除此文本文件中不以 6 个十六进制字符开头然后是“break”的所有行sedawkperl

000000PS 对于奖励积分,根据十六进制字符(即-> FFFFFF)按字母顺序和数字顺序对文件进行排序的最佳方法是什么?我应该只使用吗sort

答案1

$ 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

这用于awk提取第一个字段中恰好包含六个十六进制数字的行。该[[:xdigit:]]模式匹配一​​个十六进制数字,并且{6}需要六个。与分别使用 和 锚定到字段的开头和结尾一起^$这将仅匹配所需的行。

重定向到某个文件以将其保存在新名称下。

请注意,这似乎适用于 GNU awk(常见于 Linux),但不适用于awkOpenBSD 或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

在此表达式中,\>用于匹配十六进制数的末尾。这确保了更长数字不匹配。该\>模式匹配一​​个字边界,即单词字符和非单词字符之间的零宽度空格。


要对结果数据进行排序,只需通过管道传输结果 trough sort,或者sort -f如果您的十六进制数字同时使用大写和小写字母

答案2

为了完整起见,您也可以使用 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
$ 

此扩展 grep 表达式在每行开头精确搜索 6 个十六进制数字,后跟非空白到空白边界 ( \b)。

相关内容