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 die 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 nachfolgenden Domainnamen '='
? Wie multiple delimiter
extrahiere ich Felder?
awk
command-line
text-processing
Satish
quelle
quelle
awk
Felder verschluckt, als sie leer waren, was die Feldnummerierung beeinträchtigte. Ich wechselte-F " "
zu-F "[ ]"
undawk
schluckte die leeren Felder nicht mehr.Antworten:
Das Trennzeichen kann ein regulärer Ausdruck sein.
Produziert:
quelle
cat
ist kein Prozess erforderlich :awk '...' file
. Es wäre auch ordentlicher, das Ausgabefeld-Trennzeichen zu verwenden:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: ex:awk -F 'this|that|[=/]' '......'
(nützlich, wenn Wörter / Zeichenfolgen Dinge trennen) (Beachten Sie, dass dadurch die Leerzeichen in den Feldern zwischen zwei Trennzeichen erhalten|[ \t]+
bleiben knifflig ... da es oft Leerzeichen vor und nach 'dies' gibt, erscheinen 2 zusätzliche leere Felder zwischen den Leerzeichen und 'dies')Gute Nachrichten!
awk
Feldtrennzeichen kann ein regulärer Ausdruck sein. Sie müssen nur verwenden-F"<separator1>|<separator2>|..."
:Kehrt zurück:
Hier:
-F"/|="
Setzt das Eingabefeldtrennzeichen auf entweder/
oder=
. Anschließend wird das Ausgabefeldtrennzeichen auf eine Registerkarte gesetzt.-vOFS='\t'
verwendet das-v
Flag zum Setzen einer Variablen.OFS
ist die Standardvariable für das Ausgabefeldtrennzeichen und wird auf das Tabulatorzeichen gesetzt. Das Flag ist notwendig, da es für das OFS kein eingebautes gibt-F
.{print $3, $5, $NF}
druckt das 3., 5. und letzte Feld basierend auf dem Eingabefeldtrennzeichen.Siehe ein anderes Beispiel:
Diese Datei hat zwei Feldtrennzeichen
#
und_
. Wenn wir das zweite Feld drucken möchten, unabhängig davon, ob das Trennzeichen das eine oder das andere ist, lassen Sie uns beide Trennzeichen sein!Wo die Dateien wie folgt nummeriert sind:
quelle
Wenn Ihr Leerzeichen konsistent ist, können Sie dies als Trennzeichen verwenden. Anstatt es
\t
direkt einzufügen , können Sie das Ausgabetrennzeichen festlegen und es wird automatisch eingefügt:quelle
Für ein Feldtrennzeichen einer beliebigen Zahl
2
durch5
oder einen Buchstabena
oder#
ein Leerzeichen, bei dem das Trennzeichen mindestens zweimal und höchstens sechsmal wiederholt werden muss, zum Beispiel:Ich bin sicher, dass Variationen davon mit () und Parametern existieren
quelle
Perl Einzeiler:
Diese Befehlszeilenoptionen werden verwendet:
-n
Schleife um jede Zeile der Eingabedatei, füge die Zeile in die$_
Variable ein, drucke nicht automatisch jede Zeile-l
Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder hinzu-a
Autosplit-Modus - Perl teilt die Eingabezeilen automatisch in das@F
Array auf. Standardmäßig wird auf Leerzeichen aufgeteilt-F
Autosplit-Modifikator, in diesem Beispiel entweder/
oder=
-e
Führen Sie den Perl-Code ausPerl ist eng mit awk verwandt. Das
@F
Autosplit-Array beginnt jedoch am Index,$F[0]
während awk-Felder mit $ 1 beginnen.quelle
Eine andere Möglichkeit besteht darin, die Option -F zu verwenden, aber den regulären Ausdruck zu übergeben, um den Text zwischen der linken und / oder rechten Klammer zu drucken
()
.Der Dateiinhalt:
Der Befehl:
Ergebnis:
Verwenden Sie awk, um den Text zwischen
[]
folgenden Elementen zu drucken :Verwenden Sie,
awk -F'[][]'
aberawk -F'[[]]'
wird nicht funktionieren.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
quelle
Ich sehe viele perfekte Antworten an der Tafel, möchte aber trotzdem auch meinen Code hochladen.
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
quelle
print $3 " " $5 " " $7
kann genauso gedruckt werden wieprint $3, $5, $7
. Außerdem sehe ich keinen Vorteil darin, awk zu verwenden und dann zu sed zu leiten. Im Allgemeinen kann awk ausreichen und andere Antworten zeigen dies.