Mit awk
muss ich ein Wort in einer Datei finden, das einem Regex-Muster entspricht.
Ich möchte nur das Wort drucken, das mit dem Muster übereinstimmt.
Also, wenn in der Leitung, habe ich:
xxx yyy zzz
Und Muster:
/yyy/
Ich möchte nur bekommen:
yyy
EDIT: dank kurumi habe ich so etwas geschrieben:
awk '{
for(i=1; i<=NF; i++) {
tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
if(tmp) {
print $i
}
}
}' $1
und das habe ich gebraucht :) vielen dank!
tmp=match($i, /regexp);if(tmp){}
, Sie sollten nur in der Lage sein,if(tmp ~ $i){}
weil~
bedeutet "entspricht dem regulären Ausdruck".Antworten:
Das ist das Grundlegende
Fragen Sie
awk
nach derpattern
Verwendung//
und drucken Sie dann die Zeile aus, die standardmäßig als Datensatz bezeichnet wird und mit $ 0 gekennzeichnet ist. Lesen Sie zumindest die Dokumentation durch .Wenn Sie nur das übereinstimmende Wort ausdrucken möchten.
quelle
print
ist die Standardaktion:awk '/pattern/' file
wird ausreichen.for
Schleife funktioniert, wenn (a) "yyy" ein regulärer Ausdruck und keine gerade Zeichenfolge ist und (b) wenn dieses "yyy" nicht mit einem ganzen Feld darin übereinstimmt ein Rekord.$i=="yyy"
; es wäre$i ~ /yyy/
für einen regulären Ausdruck.Es hört sich so an, als würden Sie versuchen, das
grep -o
Verhalten von GNU zu emulieren . Dies geschieht, vorausgesetzt, Sie möchten nur die erste Übereinstimmung in jeder Zeile:Hier ist ein Beispiel mit der
awk
Implementierung von GNU (gaffen):Lesen Sie
match
,substr
,RSTART
undRLENGTH
imawk
Handbuch.Danach möchten Sie dies möglicherweise erweitern, um mehrere Übereinstimmungen in derselben Zeile zu verarbeiten.
quelle
gawk kann den passenden Teil jeder Zeile erhalten, indem er dies als Aktion verwendet:
quelle
Wenn Sie nur an der letzten Eingabezeile interessiert sind und nur eine Übereinstimmung finden möchten (z. B. einen Teil der Zusammenfassungszeile eines Shell-Befehls), können Sie auch diesen sehr kompakten Code ausprobieren , der unter Drucken von regulären Ausdrucken übernommen wurde mit `awk`? ::
Oder die komplexere Version mit einem Teilergebnis:
Warnung: Die
awk
match()
Funktion mit drei Argumenten existiert nur ingawk
, nicht inmawk
Hier ist eine weitere nette Lösung, bei der anstelle eines regulären Regex
grep
verwendet wirdawk
. Diese Lösung stellt geringere Anforderungen an Ihre Installation:quelle
Wenn Perl eine Option ist, können Sie Folgendes versuchen:
Fügen Sie den
i
Modifikator hinzu, um eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung zu implementierenSo drucken Sie alles NACH dem Spiel aus:
So drucken Sie das Spiel und alles nach dem Spiel:
quelle
Die Verwendung von sed kann in dieser Situation auch elegant sein. Beispiel (Zeile durch übereinstimmende Gruppe "JJJ" aus Zeile ersetzen):
Relevante Handbuchseite: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
quelle
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Außerhalb des Themas kann dies auch mit grep erfolgen. Veröffentlichen Sie es einfach hier, falls jemand nach einer grep-Lösung sucht
quelle
Wenn Sie wissen, in welcher Spalte sich der gesuchte Text / das gesuchte Muster befindet (z. B. "JJJ"), können Sie einfach diese bestimmte Spalte überprüfen, um festzustellen, ob sie übereinstimmt, und sie ausdrucken.
Beispiel: Eine Datei mit dem folgenden Inhalt ( asdf.txt )
Um die zweite Spalte nur zu drucken, wenn sie mit dem Muster "JJJ" übereinstimmt, können Sie Folgendes tun:
Beachten Sie, dass dies grundsätzlich auch mit jeder Zeile übereinstimmt, in der die zweite Spalte ein "JJJ" enthält, wie diese:
quelle