2016-07-04 18 views
2

Ich möchte mit awk Zeile aufteilen. und Leerraum einschließlich geschnittener vorderer und hinterer Leerraum. Wenn ich -F "[.]" Verwende, können der führende und der nachfolgende Leerraum nicht ignoriert werden.AWK FS mehrere Separatoren gehören trimmen führenden und hinteren Leerzeichen

Zum Beispiel wird dieser Befehl IPv4 erhalten, weil Standard-FS führende Raumverkleidung wird:

echo "    IPv4 Input Packets............................1123330" | awk {print $1}` 

Aber

echo "    IPv4 Input Packets............................1123330" | awk -F"[. ]" {print $1} 

NONE bekommen.

Wie IPv4 und 1123330 in awk bekommen print $1 und print $4 mit?

Antwort

3

Sie können einen Quantor + in FS Muster verwenden.

s="    IPv4 Input Packets............................1123330" 

awk -F '[. ]+' '{print $2, $5}' <<< "$s" 

IPv4 1123330 

Beachten Sie, dass Feldnummern werden von 2 starten als erstes Feld leer.

Sie können auch print $2, $NF verwenden, um dieselbe Ausgabe zu erhalten.

+0

Danke für Ihre schnelle Antwort. Aber warum ist $ 1 leer? Gibt es einen Weg, dass ich $ 1 verwenden kann, um IPv4 zu bekommen, und $ 4, um 1123330 zu bekommen? – vinllen

+2

Ich bin mir nicht sicher warum, aber das ist das Verhalten, wenn wir in awk einen nicht leeren 'FS' verwenden. Sogar "awk -F" [[: blank:]] + 'lässt "$ 1" leer. – anubhava

+1

@vinllen: Nicht klar, wenn Sie erkennen, dass Sie stattdessen $ 2 verwenden können, oder? Viel Glück. – shellter

3

Sie müssen manuell die führenden Streifen/nachfolgende Leerzeichen und dann neu zuweisen $0 Feldaufspaltung zu zwingen, wieder zu geschehen:

$ echo "    IPv4 Input Packets............................1123330" | 
awk -F'[. ]+' '{sub(/^ +| +$/,""); $0=$0; print $1, $4}' 
IPv4 1123330 

Wenn Sie alle FS Zeichen in dem Stripping enthalten sein sollen:

$ echo "    IPv4 Input Packets............................1123330" | 
awk -F'[. ]+' '{sub("^"FS"|"FS"$",""); $0=$0; print $1, $4}' 
IPv4 1123330 
Verwandte Themen