Frage

Bei folgenden Befehl ein:

echo "1: " | awk '/1/ -F ":" {print $1}'

Warum wird AWK Ausgabe:

1: 
War es hilfreich?

Lösung

"- F" ist ein Befehlszeilenargument nicht awk Syntax, versuchen Sie:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

Andere Tipps

Wenn Sie es programmatisch tun 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 ändern anstatt die BEGIN Schleife, dauert es beeinflusst für die weiter Zeile eingelesen, da die aktuelle Zeile bereits gespalten wurde.

Sie haben mehrere Möglichkeiten, um Satz : als Trennzeichen:

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

Sie alle sind gleichwertig und für eine 1 wird für eine Probeneingabe return "1: 2: 3":

$ 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

-F ist ein Argument, sich awk:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

Sie können auch einen regulären Ausdruck als Feldtrennzeichen verwenden, wird die folgende Druck „bar“ durch einen regulären Ausdruck mit der Nummer „10“ als Trennzeichen zu setzen.

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

AWK arbeitet als Textinterpreter , die linewise für das gesamte Dokument und geht die feld für jede Zeile geht also 1, $ 2 $ .. $ n beziehen sich auf die Bereiche jede Zeile ($ 1 ist das erste Feld, $ 2 das zweite Feld ist, und so weiter ...). Sie können unter Verwendung der „-F“ Schalter unter der Befehlszeile oder innerhalb von zwei Klammern mit „FS = ...“ Feldtrenn definieren. Betrachten wir nun die Antwort von "Juergen":

echo "1: " | awk -F  ":" '/1/ {print $1}'

über die Feldgrenzen gesetzt sind durch „:“ so dass wir zwei Felder haben $ 1, die „1“ und $ 2, das die leeren space.After sind, kommt den regulären Ausdruck „/ 1 /“, die die Filter zur Ausgabe weist die erste Feld nur dann, wenn der Interpreter stößt auf eine Linie, eine solche Expression enthält (i bedeuten 1); Der Ausgang des „Echo“ Befehl ist eine Zeile, die „1“, so der Filter enthält funktioniert ...

Wenn Sie mit dem folgenden Beispiel zu tun:

echo "1: " | awk '/1/ -F ":" {print $1}'

Die Syntax ist etwas chaotisch und die Dolmetscher wählte den Teil F zu ignorieren ":" und schaltet in den Standardfeldteiler, der der Leerraum ist somit die Ausgabe „1:“ als erstes Feld, und es wird nicht ein zweites Feld

Die Antwort von JUERGEN enthält die gute Syntax ...

keine Notwendigkeit, so viel zu schreiben. setzen Sie Ihren gewünschten Feldtrenn nur mit Option -F in awk und die Spaltennummer, die Sie getrennt drucken möchten nach Ihrem genannten Feldtrenn.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

Sie können auch verwendet werden:

echo "1: " | awk  '/1/{print $1-":"}' 

Das ist wirklich lustig Gleichung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top