227 votes

Délimiteur multiple AWK

J'ai un fichier qui contient les lignes suivantes.

/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

Dans la sortie ci-dessus, je veux extraire 3 champs (Numéro 2 4 et le dernier *.example.com) J'utilise la sortie suivante.

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

Comment extraire le dernier champ qui se trouve après '=' nom de domaine, comment utiliser multiple delimiter pour extraire le champ

2 votes

Pour répondre à ma question qui est la même mais différente, awk avalait les champs lorsqu'ils étaient vides, ce qui bloquait la numérotation des champs. J'ai modifié -F " " a -F "[ ]" y awk n'a plus avalé les champs vides.

374voto

embedded.kyle Points 3135

Le délimiteur peut être une expression régulière.

cat file | awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}'

Produit :

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

45 votes

Bien sûr, cat n'est pas nécessaire : awk '...' file . De plus, il serait plus ordonné d'utiliser le séparateur de champ de sortie : awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'

19 votes

Les délimiteurs Awk peuvent être des expressions régulières... c'est génial !

4 votes

@das.cyklone : awk peut aussi avoir plusieurs séparateurs, avec | : ex : awk -F 'this|that|[=/]' '......' (utile pour avoir des mots/chaînes séparant les choses) (notez que ceci garde les espaces dans les champs entre 2 séparateurs. Ajoutant aussi |[ \t]+ peut être utile, mais peut rendre les choses plus compliquées ... comme il y a souvent des espaces avant et après 'ceci', cela fera apparaître 2 champs vides supplémentaires entre les espaces et 'ceci')

51voto

fedorqui Points 42938

Bonne nouvelle ! awk Le séparateur de champ peut être une expression régulière. Il suffit d'utiliser -F"<separator1>|<separator2>|..." :

awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file

Les retours :

tc0001  tomcat7.1  demo.example.com
tc0001  tomcat7.2  quest.example.com
tc0001  tomcat7.5  www.example.com

Ici :

  • -F"/|=" définit le séparateur de champ de saisie soit / o = . Ensuite, il définit le séparateur de champ de sortie comme une tabulation.

  • -vOFS='\t' utilise le -v pour définir une variable. OFS est la variable par défaut pour le séparateur de champ de sortie et elle est définie sur le caractère de tabulation. Ce drapeau est nécessaire parce qu'il n'y a pas d'élément intégré pour le OFS comme -F .

  • {print $3, $5, $NF} imprime les 3e, 5e et dernier champs en fonction du séparateur de champs de saisie.


Voir un autre exemple :

$ cat file
hello#how_are_you
i#am_very#well_thank#you

Ce fichier comporte deux séparateurs de champs, # y _ . Si nous voulons imprimer le deuxième champ, que le séparateur soit l'un ou l'autre, faisons en sorte que les deux soient des séparateurs !

$ awk -F"#|_" '{print $2}' file
how
am

Où les fichiers sont numérotés comme suit :

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6

6voto

Thor Points 13562

Si votre espacement est cohérent, vous pouvez l'utiliser comme délimiteur, et aussi au lieu d'insérer \t directement, vous pouvez définir le séparateur de sortie et il sera inclus automatiquement :

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

5voto

Stan Lovisa Points 51

Une autre option consiste à utiliser l'option -F mais à lui passer une expression rationnelle pour imprimer le texte entre les parenthèses gauche et droite. () .

Le contenu du fichier :

528(smbw)
529(smbt)
530(smbn)
10115(smbs)

La commande :

awk -F"[()]" '{print $2}' filename

résultat :

smbw
smbt
smbn
smbs

Utiliser l'awk pour juste imprimer le texte entre [] :

Utilice awk -F'[][]' mais awk -F'[[]]' ne fonctionnera pas.

http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html

3voto

genome Points 31

Pour un séparateur de champ d'un nombre quelconque 2 par le biais de 5 ou lettre a o # ou un espace, où le caractère de séparation doit être répété au moins 2 fois et pas plus de 6 fois, par exemple :

awk -F'[2-5a# ]{2,6}' ...

Je suis sûr qu'il existe des variantes de cette méthode en utilisant ( ) et des paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X