Gegeben folgenden Befehl:
echo "1: " | awk '/1/ -F ":" {print $1}'
Warum gibt awk aus:
1:
Gegeben folgenden Befehl:
echo "1: " | awk '/1/ -F ":" {print $1}'
Warum gibt awk aus:
1:
Antworten:
"-F" ist ein Befehlszeilenargument ohne awk-Syntax. Versuchen Sie:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}. Wenn pattern(meistens eine bedingte Aussage) wahr ist , actionwird ausgeführt. Wenn patternnicht verfügbar, trueist impliziert. Hier patternist /1/der Status, 1mit dem der Regex im aktuellen Datensatz$0
Wenn Sie es programmgesteuert ausführen möchten, können Sie die FSVariable verwenden:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Beachten Sie, dass wenn Sie es in der Hauptschleife anstatt in der Schleife ändern BEGIN, es für die nächste eingelesene Zeile wirksam wird, da die aktuelle Zeile bereits geteilt wurde.
Sie haben mehrere Möglichkeiten, :als Trennzeichen festzulegen:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Alle von ihnen sind gleichwertig und werden 1für eine Beispieleingabe "1: 2: 3" zurückgegeben:
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGINAnweisung am korrektesten ist (in Übereinstimmung mit der Gesamtsyntax awk).
BEGINwenn ich eine Datei verwende, um das Ganze zu speichern, während es -Fbei Einzeilern nützlich ist.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileundawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Keine Notwendigkeit, so viel zu schreiben. Fügen Sie einfach Ihr gewünschtes Feldtrennzeichen mit der Option -F in den Befehl awk ein und die Spaltennummer, die Sie drucken möchten, getrennt nach Ihrem genannten Feldtrennzeichen.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK arbeitet als Text - Interpreter , die linewise für das gesamte Dokument geht und das geht feld für jede Zeile so 1, $ 2 $ .. $ n sind Verweise auf die Felder jeder Zeile ($ 1 das erste Feld, $ 2 ist das zweite Feld und so weiter ...). Sie können ein Feldtrennzeichen definieren, indem Sie den Schalter "-F" unter der Befehlszeile oder in zwei Klammern mit "FS = ..." verwenden. Betrachten Sie nun die Antwort von "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Über den Feldgrenzen werden durch ":" gesetzt, so dass wir zwei Felder $ 1 haben, die "1" sind, und $ 2, die der leere Raum ist. Danach folgt der reguläre Ausdruck "/ 1 /", der den Filter anweist, nur das erste Feld auszugeben wenn der Dolmetscher auf eine Zeile stößt, die einen solchen Ausdruck enthält (ich meine 1); Die Ausgabe des Befehls "echo" ist eine Zeile, die "1" enthält, damit der Filter funktioniert ...
Im folgenden Beispiel:
echo "1: " | awk '/1/ -F ":" {print $1}'
Die Syntax ist chaotisch und der Interpreter hat den Teil F ":" ignoriert. und wechselt zum Standardfeldteiler, der der leere Raum ist, wodurch "1:" als erstes Feld ausgegeben wird und es kein zweites Feld gibt!
Die Antwort von JUERGEN enthält die gute Syntax ...