![Wie kann ich diese beiden Ausgaben mit dem awk-Befehl trennen?](https://rvso.com/image/31645/Wie%20kann%20ich%20diese%20beiden%20Ausgaben%20mit%20dem%20awk-Befehl%20trennen%3F.png)
Hier ist meine Ausgabe:
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
Ich will nur die Zeit.
Wie kann ich sie trennen?
Antwort1
Analysieren Sie die Struktur der Eingabe:
key1=value1;key2=value2
Dies sind durch getrennte Felder ;
, die Sie analysieren können, indem Sie ;
den Feldtrenner erstellen. Um dann den Wert eines Felds zu extrahieren, verwenden Sie die sub
Funktion, um den key=
Teil zu entfernen (oder split
auf /=/
und nehmen Sie den zweiten Teil oder nehmen Sie die Teilzeichenfolge nach dem index
von =
). Wenn die Zeit immer im zweiten Feld steht, ist dies ein einfacher Ansatz:
awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'
Wenn Sie auf das Feld per Namen zugreifen möchten (was wahrscheinlich robuster ist), können Sie eine Schleife über die Felder ausführen:
awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'
Wenn Sie nur eine Zeile analysieren müssen, ist es einfacher, ;
den Datensatztrenner und =
den Feldtrenner zu erstellen.
awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'
Beachten Sie, dass hierdurch eine zusätzliche neue Zeile gedruckt wird. Dies ist kein Problem, wenn Sie diesen Befehl in einer Befehlsersetzung in einem Shell-Skript verwenden (… | awk …)
. Wenn Sie diese zusätzliche neue Zeile nicht möchten, setzen Sie ORS
(Ausgabedatensatztrennzeichen) auf die leere Zeichenfolge:
awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'
Es gibt auch den direkten Ansatz mit regulären Ausdrücken, der hier gute Ergebnisse liefert.
awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'
Antwort2
Sie haben mehrere awk-Antworten, hier ist eine Möglichkeit, wie Sie es mit Bash tun könnten. Bewerten Sie zuerst die Variableneinstellung:
source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")
Sie können nun EsbTiming
direkt zugreifen, zB:
printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}
Ausgabe:
Date: 2013-04-12
Time: 01:07:46.099
Antwort3
awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file
ODER
awk '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}' input_file
ODER
awk -F: '/Timing/{$1=""; print}' input_file
Grep-Lösung
grep -oP '(?<=EsbTiming=.{14}).*' Input_file
Antwort4
Wenn es Ihnen nichts ausmacht awk
, sed
verwenden Sie Folgendes:
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
Abschnitt reduziert alles bis einschließlich der Zeichenfolge „Timing=“ und hinterlässt Folgendes:
2013-04-12T01:07:46.099
awk
teilt sich beim Zeichen „T“ und wir drucken das 2. Feld aus, das Ihre Zeit ist.
01:07:46.099