2009-04-17 6 views
0

J'essaie d'analyser différentes informations à partir de fichiers journaux, dont certains sont placés entre crochets. Par exemple:awk or sed: Meilleure façon de saisir [ce texte]

Tue, 06 Nov 2007 10:04:11 INFO  processor:receive: [someuserid], [somemessage] msgtype=[T] 

Ce qui est une façon élégante de saisir « someuserid » de ces lignes, en utilisant sed, awk, ou un autre utilitaire unix?

Répondre

7

cut
utiliser comme ceci: cut -f2 -d[ | cut -f1 -d]

[email protected]:~> YOURTEXT="Tue, 06 Nov 2007 10:04:11 INFO  processor:receive: [someuserid], [somemessage] msgtype=[T]" 
[email protected]:~> SOMEID=`echo $YOURTEXT | cut -f2 -d[ | cut -f1 -d]` 
[email protected]:~> echo $SOMEID 
someuserid 
+1

Bien, je n'étais pas au courant de la coupe. Fonctionne magnifiquement. – Parand

+0

ouais, c'est tellement basique, mais ppl oublier son existence. – vartec

0

Si vous voulez faire quelque chose avec tous les les champs entre crochets, j'utiliser Perl:

perl -lne ' 
    my @fields = /\[(.*?)\]/g; 
    # do something with @fields, like: 
    print join(":", @fields); 
' logfile ... 
0

utilisant bash coquille

while read -r line 
do 
    case "$line" in 
     *processor*receive*) 
      t=${line#*[} 
      echo ${t%%]*} 
      ;; 
    esac 
done < "file" 
0
sed -n '/INFO/{s/.[^[]*\[//;s/\].*//p}' file 
0

En utilisant AWK:

cat file | awk -F[\]\[] '{print $2}' 

j'ai trouvé que plusieurs délimiteurs ne fonctionnent pas dans certaines anciennes versions de AWK. Si ce n'est pas, vous pouvez utiliser deux awks:

cat file | awk -F[ '{print $2}' | awk -F] '{print $1}' 
Questions connexes