2017-09-20 2 views
1

Wie kann ich den Arch und die Version des abgefragten RPM-Pakets mit sed oder grep anzeigen?Regex mit sed und oder grep

[[email protected] boot]# rpm -qa | grep kernel-devel 
kernel-devel-2.6.32-642.11.1.el6.x86_64 
kernel-devel-2.6.32-696.10.2.el6.x86_64 

Was ich brauche nur:

2.6.32-642.11.1.el6.x86_64 

Was fehlt in meinem sed? =>sed 's/[^\.]\+\.//'

Vielen Dank im Voraus!

+0

für mich Ihre sed funktioniert. Können Sie die Ausgabe anzeigen, die Sie erhalten, sowie die vollständige Befehlszeile, die Sie versuchen? –

Antwort

0

Sie können es mit grep tun nur:

rpm -qa | grep -P -o '(?<=kernel-devel-).*' 

Erläuterung:

  • -o Spiel nur. I.e. grep liefert nur den passenden Teil
  • -P ist perl regex mode. Es ermöglicht Lookarounds.
  • (?<=...) ist Lookbehind. I.e. Sachen vor dem Spiel. Dies ist nicht Teil des Spiels so -o geht es nicht

Natürlich zu behalten, können auch sed helfen:

rpm -qa | grep 'kernel-devel' | sed 's/^[^.0-9]*-//g' 

Erläuterung:

  • ^ entspricht dem Beginn der Zeichenfolge
  • [^.0-9] stimmt mit den nicht-Punkt, Nicht-Nummer Zeichen ab dem Anfang der Zeichenfolge überein. Dies ist der Teil, den wir nicht brauchen.
  • Die //g Ende des sed-Befehl ersetzt den angepassten Teil mit leeren String
+0

Das ist cool, danke für die ausführliche Erklärung und ihre Unterschiede. Es ist eine sehr gute Information. –

1

Sie können auch geschnitten verwenden:

rpm -qa | grep kernel-devel | cut -d \- -f 3-4 
+0

cool! es hilft !, wie drucke ich nur die erste Zeile aus dem Ausgabeergebnis? –

+0

@OutcastG add '| Kopf " – Maroun

+0

Ah, ich kann Kopf verwenden .. lass mich versuchen .. Vielen Dank @ andreas-hofmann –

1

Sie sed wie diese verwenden können, und vermeiden den Extra grep:

rpm -qa | sed '/kernel-devel/s/^[^0-9]*//' 

2.6.32-642.11.1.el6.x86_64 
2.6.32-696.10.2.el6.x86_64 
+1

yep es hat funktioniert! danke Leute! –

1

Ihre sed entfernt den ersten Punkt nach dem ersten "2", weil Es entspricht dem von Ihnen bereitgestellten Regex.

Sie können leicht beheben, indem Sie die Regex expliziter machen.

Weitere Antworten bereits vorgeschlagen, Lösungen, hier ist eine andere Verwendung grep:

$ rpm -qa | grep -oP "devel-\K(.*)" 
2.6.32-642.11.1.el6.x86_64 
2.6.32-696.10.2.el6.x86_64 

\K sagt der Engine, so zu tun, dass das Spiel Versuch an dieser Position gestartet (das ist die Alternative, die Perl für Lookbehind vorgeschlagen).

0

One in awk:

$ rpm -qa | awk 'match($0,/^kernel-devel-./){print substr($0,RLENGTH)}' 
2.6.32-642.11.1.el6.x86_64 
2.6.32-696.10.2.el6.x86_64 

Erklärt:

match($0,/^kernel-devel-./) { # if the record starts with kernel-devel-[ANYTHING] 
    print substr($0,RLENGTH)  # print starting from the [ANYTHING] 
}