Видаліть усі рядки, які не мають 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?

Відповіді:


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
Ідеально, дуже дякую. Саме те, що я шукав!
Rocco

8

А для повноти ви можете це зробити і з грепом:

$ 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
$ 

Цей розширений виразний вираз шукає рівно 6 шістнадцяткових цифр на початку кожного рядка, після чого негайно йде межа без пробілу та пробілу ( \b).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.