web-dev-qa-db-fra.com

AWK séparateur multiple

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 souhaite extraire 3 champs (les numéros 2, 4 et le dernier *.example.com). Je reçois la sortie suivante:

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

Comment puis-je également extraire le dernier champ avec le nom de domaine qui se trouve après '='? Comment utiliser multiple delimiter pour extraire un champ?

177
Satish

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

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

Produit:

tc0001   Tomcat7.1    demo.example.com  
tc0001   Tomcat7.2    quest.example.com  
tc0001   Tomcat7.5    www.example.com
288
embedded.kyle

Bonnes nouvelles! awk le séparateur de champs peut être une expression régulière. Vous devez juste utiliser -F"<separator1>|<separator2>|...":

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

Résultats:

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 sur / ou =. Ensuite, il définit le séparateur de champ de sortie sur un onglet.

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


Voir un autre exemple:

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

Ce fichier contient deux séparateurs de champs, # et _. 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
34
fedorqui

Si votre espace est cohérent, vous pouvez l'utiliser comme délimiteur. Au lieu d'insérer directement \t, vous pouvez définir le séparateur de sortie. Celui-ci sera automatiquement inclus:

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

Pour un séparateur de champ de tout numéro 2 à 5 ou lettre a ou # ou un espace, où le caractère de séparation doit être répété au moins 2 fois et au plus 6 fois, par exemple:

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

Je suis sûr que des variantes existent avec () et des paramètres

3
genome

Perl one-liner:

Perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

Ces options de ligne de commande sont utilisées:

  • -n boucle autour de chaque ligne du fichier d'entrée, placez la ligne dans la variable $_, n'imprimez pas automatiquement chaque ligne

  • -l supprime les nouvelles lignes avant le traitement et les rajoute après

  • -a mode autosplit - Perl scinde automatiquement les lignes d'entrée dans le tableau @F. Fractionnement par défaut des espaces

  • Modificateur -F autosplit, dans cet exemple, divise soit en /, soit =

  • -e exécute le code Perl

Perl est étroitement lié à awk, cependant, le tableau @F autosplit commence à l'index $F[0] tandis que les champs awk commencent par $ 1.

2
Chris Koknat

Je vois beaucoup de réponses parfaites sur le tableau, mais j'aimerais quand même télécharger mon morceau de code aussi,

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'

0
Sadhun