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?
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
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
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}'
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
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.
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'