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 , action
wird ausgeführt. Wenn pattern
nicht verfügbar, true
ist impliziert. Hier pattern
ist /1/
der Status, 1
mit dem der Regex im aktuellen Datensatz$0
Wenn Sie es programmgesteuert ausführen möchten, können Sie die FS
Variable 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 1
fü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
BEGIN
Anweisung am korrektesten ist (in Übereinstimmung mit der Gesamtsyntax awk
).
BEGIN
wenn ich eine Datei verwende, um das Ganze zu speichern, während es -F
bei Einzeilern nützlich ist.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
undawk '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 ...