Usuń wszystkie wiersze, które nie mają n znaków przed ogranicznikiem

11

Mam bardzo długi plik tekstowy ( stąd ), który powinien zawierać 6 znaków szesnastkowych, a następnie „przerwa” (która pojawia się jako jeden znak i wydaje się, że nie wyświetla się poprawnie w poniższym znaczniku kodu), po której następuje kilka słów:

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

Rozejrzałem się dookoła i nie widzę czegoś, co zadziałałoby w tej sytuacji. Moje pytanie brzmi: w jaki sposób mogę użyć grep/ sed/ awk/, perlaby usunąć wszystkie wiersze tego pliku tekstowego, które nie zaczynają się dokładnie 6 znakami szesnastkowymi, a następnie „przerwa”?

PS W przypadku punktów bonusowych, jaki jest najlepszy sposób sortowania pliku alfabetycznie i numerycznie według znaków szesnastkowych (tj. 000000-> FFFFFF)? Czy powinienem po prostu użyć sort?

Rocco
źródło

Odpowiedzi:

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

Służy awkdo wyodrębnienia wierszy zawierających dokładnie sześć cyfr szesnastkowych w pierwszym polu. [[:xdigit:]]Wzorzec pasuje cyfrę szesnastkową i {6}wymaga sześć z nich. W połączeniu z zakotwiczeniem na początku i na końcu pola za pomocą ^i $, będzie to pasować tylko do pożądanych linii.

Przekieruj do jakiegoś pliku, aby zapisać go pod nową nazwą.

Zauważ, że wydaje się, że działa to z GNU awk(powszechnie występującym w Linuksie), ale nie w przypadku awknp. OpenBSD lub mawk.


Podobne podejście z 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

W tym wyrażeniu \>jest używany do dopasowania końca liczby szesnastkowej. Zapewnia to, że dłuższe liczby nie są dopasowane. \>Wzór odpowiada granicę słowa , czyli zerowej szerokości przestrzeni między znakiem słowa i nie ma charakteru tekstu.


Aby posortować otrzymane dane, po prostu przesuń rurkę wyników sortlub sort -fjeśli liczby szesnastkowe używają zarówno wielkich, jak i małych liter

Kusalananda
źródło
1
Idealnie, bardzo dziękuje. Dokładnie tego szukałem!
Rocco
8

I dla kompletności możesz to zrobić również za pomocą 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
$ 

To rozszerzone wyrażenie grep wyszukuje dokładnie 6 cyfr szesnastkowych na początku każdej linii, a następnie natychmiast następuje granica spacji do białych znaków ( \b).

Cyfrowa trauma
źródło