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?
$ 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.
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.
La solution grep-awk originale peut être simplifiée:
$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"
$ 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.
Avec grep
et son support PCRE et \K
notifier.
command |grep -Po 'text4: \K.*'