it-swarm.com.de

AWK-Mehrfachbegrenzer

Ich habe eine Datei, die folgende Zeilen enthält:

/logs/tc0001/Tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/Tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/Tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

In der obigen Ausgabe möchte ich 3 Felder extrahieren (Nummer 2, 4 und das letzte *.example.com). Ich erhalte folgende Ausgabe:

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   Tomcat7.1
tc0001   Tomcat7.2
tc0001   Tomcat7.5

Wie extrahiere ich auch das letzte Feld mit dem Domainnamen nach '='? Wie verwende ich multiple delimiter Feld extrahieren?

177
Satish

Das Trennzeichen kann ein regulärer Ausdruck sein.

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

Produziert:

tc0001   Tomcat7.1    demo.example.com  
tc0001   Tomcat7.2    quest.example.com  
tc0001   Tomcat7.5    www.example.com
288
embedded.kyle

Gute Nachrichten! awk Feldtrennzeichen kann ein regulärer Ausdruck sein. Sie müssen nur -F"<separator1>|<separator2>|...":

awk -F"/|=" '{print $3, $5, $NF}' file

Kehrt zurück:

tc0001 Tomcat7.1  demo.example.com
tc0001 Tomcat7.2  quest.example.com
tc0001 Tomcat7.5  www.example.com

Hier:

  • -F="/|=" setzt das Eingabefeld-Trennzeichen auf entweder / oder =. Anschließend wird das Ausgabefeldtrennzeichen auf eine Registerkarte gesetzt.

  • {print $3, $5, $NF} druckt das 3., 5. und letzte Feld basierend auf dem Eingabefeldtrennzeichen.


Siehe ein anderes Beispiel:

$ cat file
hello#how_are_you
i#am_very#well_thank#you

Diese Datei hat zwei Feldtrennzeichen, # und _. Wenn wir das zweite Feld unabhängig von dem einen oder anderen Trennzeichen drucken möchten, lassen Sie uns beide Trennzeichen sein!

$ awk -F"#|_" '{print $2}' file
how
am

Wo die Dateien wie folgt nummeriert sind:

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6
34
fedorqui

Wenn Ihr Leerzeichen konsistent ist, können Sie es als Trennzeichen verwenden. Anstatt \t Direkt einzufügen, können Sie auch das Ausgabetrennzeichen festlegen, das automatisch eingefügt wird:

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'
5
Thor

Für ein beliebiges Feldtrennzeichen 2 durch 5 oder Buchstabe a oder # oder ein Leerzeichen, bei dem das Trennzeichen mindestens zweimal und höchstens sechsmal wiederholt werden muss, zum Beispiel:

awk -F'[2-5a# ]{2,6}' ...

Ich bin sicher, dass Variationen davon mit () und Parametern existieren

3
genome

Perl Einzeiler:

Perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

Diese Befehlszeilenoptionen werden verwendet:

  • -n Schleife um jede Zeile der Eingabedatei, setze die Zeile in das $_ Variable, drucke nicht automatisch jede Zeile

  • -l entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder ein

  • -a Autosplit-Modus - Perl teilt die Eingabezeilen automatisch in @F Array. Standardmäßig wird auf Leerzeichen aufgeteilt

  • -F Autosplit-Modifikator, in diesem Beispiel aufgeteilt auf entweder / oder =

  • -e Den Perl-Code ausführen

Perl ist eng mit awk verwandt, jedoch ist das @F Autosplit-Array beginnt bei Index $F[0] während awk Felder mit $ 1 beginnen.

2
Chris Koknat

Ich sehe viele perfekte Antworten, möchte aber trotzdem meinen Code hochladen.

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'

0
Sadhun