it-swarm.com.de

Verwenden Sie awk, um das erste Vorkommen von string nur nach einem Trennzeichen zu finden

Ich habe eine Reihe von Dokumenten, die alle die Zeile Account number: 123456789 an verschiedenen Stellen haben.

Ich muss in der Lage sein, die Dateien zu analysieren und die Kontonummer selbst zu finden. Daher muss awk nach Account number: suchen und die folgende Zeichenfolge zurückgeben.

Wenn es zum Beispiel war:

Account number: 1234567

awk sollte zurückgeben:

1234567

Sobald es das erste Vorkommen gefunden hat, kann es aufhören zu suchen.

Aber ich bin verblüfft. Was ist der richtige Weg dies mit awk zu tun?

22
DrDavid

Einweg:

awk -F: '$1=="Account number"{print $2;exit;}' file

Ich gehe davon aus, dass Sie den Moment stoppen möchten, an dem Sie das erste Vorkommen in der Datei finden. Wenn Sie Vorkommen in jeder Zeile der Datei suchen möchten, entfernen Sie einfach die Variable exit.

35
Guru

Sie können eine if verwenden, um zu prüfen, ob $1 und $2 "Konto" und "Nummer:" gleich sind. Wenn ja, dann $3 drucken:

> awk '{if ($1 == "Account" && $2 == "number:") {print $3; exit;}}' input.txt
6
user334856

Für solche Übereinstimmungen benutze ich grep lieber mit Look-Behind:

grep -Po '(?<=Account number: )\d+' file

oder

grep -Po 'Account number: \K\d+' file

Dies bedeutet: Drucken Sie die Folge von Ziffern (\d+), die nach der Zeichenfolge Account number: erscheinen.

Im zweiten Fall löscht \K die übereinstimmende Zeichenfolge, so dass nach \K mit dem Drucken begonnen wird.


Sieh es in Aktion bei einer Datei file:

Account number: 1234567
but then another Account number: 789
and that's all

Mal sehen, wie die Ausgabe aussieht:

$ grep -Po '(?<=Account number: )\d+' file
1234567
789
3
fedorqui

Sie können auch sed -n s///p verwenden:

sed -En 's/^Account number: (.+)/\1/p' *.txt | head -n1
0
Lri