Удалить все строки, которые не имеют n символов перед разделителем

11

У меня есть очень длинный текстовый файл ( отсюда ), который должен содержать 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

Я немного осмотрелся и не вижу того, что сработало бы в этой ситуации. У меня вопрос, как я могу использовать grep/ sed/ awk/, perlчтобы удалить все строки этого текстового файла, которые не начинаются с ровно 6 шестнадцатеричных символов, а затем с «разрывом»?

PS Что касается бонусных баллов, каков наилучший способ сортировки файла по алфавиту и по номерам в соответствии с шестнадцатеричными символами (т.е. 000000-> FFFFFF)? Должен ли я просто использовать sort?

Rocco
источник

Ответы:

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), но не с, 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

В этом выражении \>используется для сопоставления конца шестнадцатеричного числа. Это гарантирует, что более длинные числа не совпадают. \>Шаблон совпадает с границей слова , то есть нулевая ширина пространство между характером слова и без слов характера.


Для сортировки результирующих данных просто передайте результат через корыто 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).

Цифровая травма
источник