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

Сsed:

sed -n '/EPMAT/{ s/.*EPMAT-//; s/[^0-9].*//; p; q; }' file
11
10.04.2019, 19:46
2 ответа
$ 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, например, на Linux. 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, если в ваших шестнадцатеричных числах используются как прописные, так и строчные буквы

13
27.01.2020, 19:57

Для полноты картины это можно сделать и с помощью 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).

8
27.01.2020, 19:57

Теги

Похожие вопросы