web-dev-qa-db-fra.com

Comment rechercher et extraire une chaîne de la sortie d'une commande?

OS: Kernel 2.6.x

tilitaires: À partir de busybox 1.2x

Une commande génère plusieurs lignes de texte.

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

Objectif: Je dois rechercher la ligne qui contient "text4:" (sans guillemets), puis extraire tous les caractères après cette chaîne jusqu'à la fin de la ligne.

Sortie souhaitée: "lkpird sdfd" (avec guillemets)

Actuellement, j'ai ...

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

Existe-t-il un moyen plus simple d'écrire cela?

10
uihdff

Utilisation de sed

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

-n Dit à sed de ne pas imprimer à moins que nous ne le lui demandions explicitement. s/.*text4:// Indique à sed de supprimer tout texte du début de la ligne jusqu'à l'occurrence finale de text4:. Si une telle ligne est trouvée, le p dit à sed de l'imprimer.

Utilisation de grep -P

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

-o Indique à grep de n'imprimer que la partie correspondante. (?<=text4:).* Correspond à tout texte qui suit text4: Mais n'inclut pas le text4:.

L'option -P Requiert GNU grep. Ainsi, cela ne fonctionnera pas avec la fonction intégrée de busybox grep, ni avec la valeur par défaut grep sur les systèmes BSD/Mac OSX.

Utiliser awk

La solution grep-awk originale peut être simplifiée:

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

Utilisation de awk (alternative)

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

/text4:/ Sélectionne les lignes contenant text4:. sub(/.*text4:/, "") indique à awk de supprimer tout le texte du début de la ligne à la dernière occurrence de text4: sur la ligne. print indique à awk d'imprimer ces lignes.

17
John1024

Avec grep et son support PCRE et \K notifier.

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