Wie drucke ich nur die Ticketnummern aus?

Wie drucke ich nur die Ticketnummern aus?

Nachfolgend sehen Sie den Inhalt der Datei. Ich muss nur die Ticketnummern ausdrucken, die in "[]" eingeschlossen sind. Ich bin neugierig, ob dies mit den Befehlen sed und grep möglich ist.

[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

Die Ausgabe sollte wie folgt aussehen:

26727777
25709048
26716590
23995808

Ich habe es versucht sed -e 's/[^0-9]//g' ticket | sed '/^$/d', aber ich kann nicht die gewünschte Ausgabe erhalten. Es enthält auch andere numerische Werte in der Zeile und ich muss nur die Ticketnummer erhalten:

226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216

Antwort1

Sie können GNU verwenden grep:

$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

Oder sed:

sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

Beide oben genannten Methoden funktionieren in dem von Ihnen angegebenen Beispiel, aber ob sie in Ihrer echten Datei funktionieren, hängt von den anderen Zeilen in Ihrer Datei ab. Sie drucken alle Zahlenfolgen, die nach einem stehen, /und, für das grep, die vor einem stehen ]. Wenn Sie andere Zeilen haben, die diesen Kriterien entsprechen, müssen Sie uns Ihre gesamte Datei zeigen.

Antwort2

Ich persönlich würde Perl verwenden.

perl -lne 'print /(\d+)\]/'

Sollte funktionieren.

-lum zu sagen „Zeilenumbrüche sortieren“ - es entfernt sie automatisch aus der Zeile und fügt sie nach jedem ein print.

-nsagt: „Packen Sie dies in eine while (<>) {Schleife – die Zeile für Zeile von STDIN (oder der Datei) iteriert, so wie grepes der Fall wäre.“

Und -e"Ausdruck" (oder "Ausführen", nehme ich an) zum Ausführen des Befehls ist in Anführungszeichen gesetzt. (Andernfalls perllesen Sie das Programm von STDIN)

Wir nutzen die Tatsache, dass die Standardübereinstimmung für einen regulären Ausdruck „dagegen“ lautet $_(in diesem Kontext ist das die aktuelle Zeile).

Da wir eine Erfassungsgruppe angeben, wird statt „true“ oder „false“ eine (einzelne) Liste erfasster Werte zurückgegeben:

\d+ist eine oder mehrere Ziffern. (Es handelt sich um einen „erweiterten“ regulären Ausdruck, der ungefähr ähnlich ist wie [0-9]+, obwohl er etwas anders funktioniert, wenn Sie nicht-lateinische Zahlen verwenden), und wir benötigen ]danach ein .

Und weil wirnichtgam Ende des regulären Ausdrucks verwenden , es stimmt nur einmal pro Zeile überein.

Antwort3

sed 's/[^0-9]*\([0-9]*\).*/\1/'

Wenn die Ticketnummer jedoch eine feste Breite hätte, würde ich lieber verwenden cut.

Bearbeiten: mit grep: grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

Antwort4

tr "\[\]/" " "| awk '/request/ {  print $3 }'

verwandte Informationen