2009-10-15 9 views
2

J'ai un fichier journal et j'utilise awk pour extraire les colonnes requises. Ma commande estObtenir seulement une partie de la ligne en utilisant awk

awk '{ print $2" "$5" " $6}' log.txt 

La colonne 5 $ contient le nom du serveur et le format peut être comme @: @ server1: @: @ :, @ server2: @: @: @: @ :, @: @: avec Server3 pas de montant fixe de @: symboles.

Comment puis-je modifier mon instruction afin que je supprime tous les '@:' de la colonne 5 pour obtenir uniquement le nom du serveur?

+0

Vous dites « 5 $ colonne » en un seul endroit et « colonne 3 » dans un autre - avons-nous mal compris où vous devez effectuer la substitution? – Cascabel

+0

Était une faute de frappe. Correction de – randomThought

Répondre

3

Vous pouvez utiliser la fonction gensub. EDIT: Voir le commentaire de glenn jackman, ci-dessous, pour d'éventuelles implications de portabilité.

+1

Est-ce que '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' que '? 'gsub (/ @: /," ", $ 5)' est "portable" –

+0

Ouch, vous avez probablement raison. –

0

Je suggère quelque chose comme ceci:

awk '{ sub("^(@:)*","",$5); sub("(@:)*$","",$5); print $2" "$5" "$6 }' 

Notez que vous pouvez également écrire print $2,$5,$6 - le « » est remplacé par le séparateur de champ de sortie, qui est par défaut un espace.

(sous la direction de supprimer « @: » à partir de la fin de la chaîne, ainsi)

Questions connexes