Löschen Sie alle Zeilen, die vor dem Trennzeichen keine n Zeichen enthalten

11

Ich habe eine sehr lange Textdatei (von hier ), die 6 hexadezimale Zeichen enthalten sollte, dann eine Unterbrechung (die als ein Zeichen erscheint und im Code-Markdown unten nicht richtig angezeigt wird), gefolgt von ein paar Wörtern:

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

Ich habe mich umgesehen und kann nichts sehen, was in dieser Situation funktionieren würde. Meine Frage ist, wie kann ich grep/ sed/ awk/ verwenden perl, um alle Zeilen dieser Textdatei zu löschen, die nicht mit genau 6 hexadezimalen Zeichen und dann einem 'break' beginnen?

PS Wie kann man die Datei für Bonuspunkte am besten alphabetisch und numerisch nach den Hex-Zeichen (dh 000000-> FFFFFF) sortieren ? Soll ich nur verwenden sort?

Rocco
quelle

Antworten:

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

Dies wird verwendet awk, um die Zeilen zu extrahieren, die genau sechs hexadezimale Ziffern im ersten Feld enthalten. Das [[:xdigit:]]Muster entspricht einer hexadezimalen Ziffer und {6}erfordert sechs davon. Zusammen mit der mit zu Beginn und am Ende des Feldes Verankerung ^und $jeweils, wird dies nur auf den gewünschten Linien entspricht.

Leiten Sie zu einer Datei um, um sie unter einem neuen Namen zu speichern.

Beachten Sie, dass dies mit GNU awk(häufig unter Linux) zu funktionieren scheint , jedoch nicht mit awkOpenBSD oder mawk.


Ein ähnlicher Ansatz mit 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

In diesem Ausdruck \>wird verwendet, um das Ende der Hexadezimalzahl abzugleichen. Dies stellt sicher, dass längere Nummern nicht übereinstimmen. Das \>Muster entspricht einer Wortgrenze , dh dem Raum mit der Breite Null zwischen einem Wortzeichen und einem Nichtwortzeichen.


Um die resultierenden Daten zu sortieren, leiten Sie einfach das Ergebnis durch sortoder sort -fwenn Ihre Hexadezimalzahlen sowohl Groß- als auch Kleinbuchstaben verwenden

Kusalananda
quelle
1
Perfekt, vielen Dank. Genau das, wonach ich gesucht habe!
Rocco
8

Und der Vollständigkeit halber können Sie dies auch mit grep tun:

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

Dieser erweiterte grep-Ausdruck sucht am Anfang jeder Zeile nach genau 6 hexadezimalen Ziffern, gefolgt von einer Grenze zwischen Leerzeichen und Leerzeichen ( \b).

Digitales Trauma
quelle