0
votes

bash: impression awk avec impression

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?


0 commentaires

3 Réponses :


0
votes

Essayez ceci

awk -F'[:,]+' '/Jenny/{print $2}' file.txt 
  • Il utilise plusieurs valeurs -F dans le []
  • Le + signifie un ou plusieurs car il est traité comme une expression régulière.


0 commentaires

0
votes

Vous pouvez essayer quelque chose comme:

awk -F: '/Jenny/ {split($2,a,","); print a[1]}' file 


0 commentaires

0
votes

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:

  • Le truc jusqu'à \ 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 .

  • 0 commentaires