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'obtiens la sortie suivante:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
Comment extraire également le dernier champ avec le nom de domaine qui se trouve après '='
? Comment utiliser multiple delimiter
pour extraire le champ?
awk
command-line
text-processing
Satish
la source
la source
awk
c'était avaler des champs quand ils étaient vides ce qui empêchait la numérotation des champs. J'ai changé-F " "
pour-F "[ ]"
etawk
n'ai plus avalé les champs vides.Réponses:
Le délimiteur peut être une expression régulière.
Produit:
la source
cat
processus n'est pas nécessaire:awk '...' file
. En outre, il serait plus judicieux d'utiliser le séparateur de champ de sortie:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: ex:awk -F 'this|that|[=/]' '......'
(utile pour avoir des mots / chaînes séparant les choses) (notez que cela garde les espaces dans les champs entre 2 séparateurs. L'ajout également|[ \t]+
peut être utile, mais peut rendre les choses délicat ... 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')Bonnes nouvelles!
awk
le séparateur de champ peut être une expression régulière. Il vous suffit d'utiliser-F"<separator1>|<separator2>|..."
:Retour:
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.-vOFS='\t'
utilise l'-v
indicateur 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. Le drapeau est nécessaire car il n'y a pas de fonction intégrée pour l'OFS comme-F
.{print $3, $5, $NF}
imprime les 3ème, 5ème et derniers champs en fonction du séparateur de champ d'entrée.Voir un autre exemple:
Ce fichier a deux séparateurs de champs
#
et_
. Si nous voulons imprimer le deuxième champ indépendamment du fait que le séparateur soit l'un ou l'autre, faisons que les deux soient des séparateurs!Où les fichiers sont numérotés comme suit:
la source
Si votre espace est cohérent, vous pouvez l'utiliser comme délimiteur, également au lieu d'insérer
\t
directement, vous pouvez définir le séparateur de sortie et il sera inclus automatiquement:la source
Pour un séparateur de champ d'un nombre quelconque
2
par5
lettre oua
ou#
ou un espace, où le caractère de séparation doit être répétée au moins 2 fois et pas plus de 6 fois, par exemple:Je suis sûr que des variations existent en utilisant () et des paramètres
la source
Perl one-liner:
Ces options de ligne de commande sont utilisées:
-n
boucle autour de chaque ligne du fichier d'entrée, place la ligne dans la$_
variable, n'imprime pas automatiquement chaque ligne-l
supprime les nouvelles lignes avant le traitement et les ajoute à nouveau après-a
mode autosplit - perl divisera automatiquement les lignes d'entrée dans le@F
tableau. Par défaut, la division sur un espace blanc-F
modificateur autosplit, dans cet exemple se divise sur/
ou=
-e
exécuter le code perlPerl est étroitement lié à awk, cependant, le
@F
tableau de fractionnement automatique commence à l'index$F[0]
tandis que les champs awk commencent par $ 1.la source
Une autre consiste à utiliser l'option -F mais à lui transmettre l'expression régulière pour imprimer le texte entre les parenthèses gauche et droite
()
.Le contenu du fichier:
La commande:
résultat:
Utiliser awk pour simplement imprimer le texte entre
[]
:Utilisez
awk -F'[][]'
maisawk -F'[[]]'
ne fonctionnera pas.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
la source
Je vois de nombreuses réponses parfaites sur le tableau, mais j'aimerais toujours télécharger mon morceau de code aussi,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
la source
print $3 " " $5 " " $7
peut être imprimé tout commeprint $3, $5, $7
. De plus, je ne vois pas l'avantage d'utiliser awk puis de canaliser pour sed. En général, awk peut suffire et d'autres répondent le montrent.