it-swarm.com.de

Drucken Sie bestimmte Wörter / Zahlen mit den Befehlen grep / cut

Ich habe eine Datei test.txt, die folgendes Ergebnis enthält:

service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

und so weiter bis service_name1500

Ich möchte eine Ausgabe wie:

Egg 12.34.56
joker 23.45.67

und so weiter: die Versionsnummer zusammen mit dem Wort davor.

7
Donald

Dies sollte ein einfacher cut Job sein:

cut -d/ -f5,6 --output-delimiter=" "
  • -d/ setzt den Eingabetrenner auf /
  • -f5,6 gibt nur das 5. und 6. Feld aus
  • --output-delimiter=" " legt das Ausgabetrennzeichen als Leerzeichen fest

Dasselbe gilt für awk, awk. Standardmäßig wird das Ausgabefeldtrennzeichen als Leerzeichen festgelegt:

awk -F/ '{print $5,$6}'

Beispiel:

% cat file.txt
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

% cut -d/ -f5,6 --output-delimiter=" " file.txt
Egg 12.34.56
joker 23.45.67

% awk -F/ '{print $5,$6}' file.txt
Egg 12.34.56 
joker 23.45.67
10
heemayl

eine sed -Lösung (funktioniert unabhängig davon, ob die Feldposition der Versionszeichenfolge konsistent ist oder nicht, aber die Form der Versionszeichenfolge muss konsistent sein)

$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
Egg 12.34.56

joker 23.45.67

Erläuterung

  • -r benutze ERE, damit wir nicht mit () Metazeichen umgehen müssen
  • s#old#new# Muster finden old und durch new ersetzen
  • .* stimmt mit einem oder keinem Zeichen an dieser Position überein
  • (stuff) erinnere mich an stuff für später
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2} Ein Muster aus [2 Ziffern]. [2 Ziffern]. [2 Ziffern]
  • \1 \2 die zwei erinnerten Muster mit einem Leerzeichen dazwischen
8
Zanna

Dies wird es tun:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
5
Soren A

Wenn Sie mit festen Word-Positionen arbeiten, würde dies funktionieren:

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
3
0x0C4
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt

Erklärung:

  • .* am Anfang und Ende schneidet alle Zeichen aus, die nicht den folgenden entsprechen
  • ([[:alpha:]]+) Die erste Untergruppe in Klammern entspricht nur alphabetischen Zeichen
  • \/ entspricht einem Schrägstrich, der ausgeschnitten wird
  • die nächste Untergruppe ([\.0-9]*) stimmt mit Zahlen und Punkten überein und speichert sie im zweiten Register
  • nach dem einfachen Schrägstrich / folgt die Ersetzung durch \1 \2 und fügt das erste und zweite Register aus den übereinstimmenden Untergruppen ein
2
SeDav

Langwierig, aber funktionierend python einzeilig:

$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt          
Egg 12.34.56
joker 23.45.67

Wie es funktioniert:

  • leiten Sie die Eingabedatei mit < in den stdin-Stream von Python um
  • verwenden Sie das Listenverständnis [item for item in sequence], um stdin zeilenweise zu lesen
  • Mit .split() können wir Zeilen in Wortlisten unter Verwendung von / als Trennzeichen aufteilen
  • extrahiere die Wörter 4 und 5 (die [4: 6] impliziert, dass die letzte Zahl nicht inklusive ist) und mache mit ' '.join() eine Zeichenkette aus ihnen
  • nachdem Sie eine Liste der gewünschten Zeichenfolgen erstellt haben, können Sie diese mit '\n'.join() in Zeilen umwandeln und alles ausdrucken
1