删除所有在定界符前没有n个字符的行


11

我有一个很长的文本文件(从此处开始),其中应包含6个十六进制字符,然后是一个“ break”(显示为一个字符,在下面的代码降价中似乎无法正确显示),然后是几个单词:

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/ sed/ awk/ perl删除此文本文件中所有不以正好6个十六进制字符开头,然后以“ break”开头的行?

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

Answers:


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

这用于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

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


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


1
太好了,非常感谢。正是我想要的!
罗科

8

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.