J'ai besoin de grep un certain modèle et de plus, j'ai besoin d'imprimer une sortie à l'intérieur de cela. Actuellement, j'utilise la commande ci-dessous qui fonctionne bien. Mais j'aime éliminer l'utilisation de plusieurs tuyaux et je veux utiliser une seule commande awk pour obtenir le même résultat. Existe-t-il un moyen de le faire en utilisant awk?
root@Server1 # cat file Jenny:Mon,Tue,Wed:Morning David:Thu,Fri,Sat:Evening root@Server1 # awk '/Jenny/ {print $0}' file | awk -F ":" '{ print $2 }' | awk -F "," '{ print $1 }' Mon
Je veux obtenir cette sortie en utilisant une seule commande awk. De l'aide?
3 Réponses :
Essayez ceci
awk -F'[:,]+' '/Jenny/{print $2}' file.txt
-F
dans le []
+
signifie un ou plusieurs car il est traité comme une expression régulière. Vous pouvez essayer quelque chose comme:
awk -F: '/Jenny/ {split($2,a,","); print a[1]}' file
Pour ce travail particulier, je trouve que grep
est légèrement plus robuste.
À moins que votre entreprise n'ait pour politique de ne pas embaucher de personnes nommées Eve.
(Essayez-le si vous ne comprenez pas.)
Mon
Ou pour faire une correspondance de mots entiers:
grep -oP '^Jenny:\K[^,:]+' file
Ou quand vous sont convaincus que "Jenny" est le nom complet:
grep -oP '^[^:]*\bJenny\b[^:]*:\K[^,:]+' file
Résultat:
grep -oP '^[^:]*Jenny[^:]*:\K[^,:]+' file
Explication:
\ K
parle de lui-même: il sélectionne la ou les lignes avec le nom souhaité. [^ ,:] +
capture le jour de la semaine (dans ce cas, Mon
). \ K
coupe tout ce qui précède le lundi
. -o
coupe tout ce qui suit Mon
.