it-swarm.com.de

Wie suche und extrahiere ich eine Zeichenfolge aus der Befehlsausgabe?

OS : Kernel 2.6.x.

Dienstprogramme : Von Busybox 1.2x

Ein Befehl gibt mehrere Textzeilen aus.

string1 text1: "asdfs asdf adfas"
string2 text2: "iojksdfa kdfj adsfj;"
string3 text3: "skidslk sadfj"
string4 text4: "lkpird sdfd"
string5 text5: "alskjfdsd safsd"

Ziel : Ich muss nach der Zeile suchen, die "text4:" enthält (keine Anführungszeichen), und dann alle Zeichen nach dieser Zeichenfolge bis zum Ende der Zeile extrahieren.

Gewünschte Ausgabe : "lkpird sdfd" (mit Anführungszeichen)

Derzeit habe ich ...

command | grep 'text4:' | awk -F': ' '{print $3}'

Gibt es eine einfachere Möglichkeit, dies zu schreiben?

10
uihdff

Mit sed

$ command | sed -n 's/.*text4://p'
 "lkpird sdfd"

-n Weist sed an, nicht zu drucken, es sei denn, wir bitten ausdrücklich darum. s/.*text4:// Weist sed an, jeglichen Text vom Zeilenanfang bis zum endgültigen Auftreten von text4: Zu entfernen. Wenn eine solche Zeile gefunden wird, weist das p sed an, sie zu drucken.

Verwenden von grep -P

$ command | grep -oP '(?<=text4:).*' 
 "lkpird sdfd"

-o Weist grep an, nur das passende Teil zu drucken. (?<=text4:).* Entspricht jedem Text, der auf text4: Folgt, enthält jedoch nicht text4:.

Die Option -P Erfordert GNU grep. Daher funktioniert sie weder mit dem eingebauten grep der Busybox noch mit dem Standard grep auf BSD/Mac OSX-Systemen.

Mit awk

Die ursprüngliche grep-awk-Lösung kann vereinfacht werden:

$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"

Verwenden von awk (alternativ)

$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
 "lkpird sdfd"

/text4:/ Wählt Zeilen aus, die text4: Enthalten. sub(/.*text4:/, "") weist awk an, den gesamten Text vom Zeilenanfang bis zum letzten Auftreten von text4: in der Zeile zu entfernen. print weist awk an, diese Zeilen zu drucken.

17
John1024

Mit grep und seiner PCRE-Unterstützung und \K benachrichtigen.

command |grep -Po 'text4: \K.*'
4
αғsнιη