152 votes

Comment imprimer un motif regex correspondant à l'aide de awk ?

Utilisation awk J'ai besoin de trouver un mot dans un fichier qui corresponde à un motif regex.

I seulement veut imprimer le mot correspondant au modèle.

Donc, si dans la ligne, j'ai :

xxx yyy zzz

Et le motif :

/yyy/

Je veux seulement obtenir :

yyy

EDIT : merci à kurumi J'ai réussi à écrire quelque chose comme ça :

awk '{
        for(i=1; i<=NF; i++) {
                tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
                if(tmp) {
                        print $i
                }
        }
}' $1

et c'est ce dont j'avais besoin :) merci beaucoup !

190voto

kurumi Points 10096

Il s'agit de l'élément de base

awk '/pattern/{ print $0 }' file

demander awk pour rechercher pattern en utilisant // puis imprimer la ligne, qui par défaut s'appelle un enregistrement, désigné par $0. Au moins, lisez la page la documentation .

Si vous voulez seulement imprimer le mot correspondant.

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file

161voto

Johnsyweb Points 45395

Il semble que vous essayez d'émuler le système GNU grep -o comportement. Ceci est possible à condition que vous ne souhaitiez que la première correspondance sur chaque ligne :

awk 'match($0, /regex/) {
    print substr($0, RSTART, RLENGTH)
}
' file

Voici un exemple, utilisant le logiciel GNU awk ( s'étonner ) :

awk 'match($0, /a.t/) {
    print substr($0, RSTART, RLENGTH)
}
' /usr/share/dict/words | head
act
act
act
act
aft
ant
apt
art
art
art

Lire la suite match , substr , RSTART y RLENGTH dans le awk manuel.

Par la suite, vous souhaiterez peut-être étendre cette procédure pour traiter les correspondances multiples sur la même ligne.

47voto

royas Points 1378

s'étonner peut obtenir la partie correspondante de chaque ligne en utilisant cette action :

{ if (match($0,/your regexp/,m)) print m[0] }

match(string, regexp [, Si le tableau est présent, il est effacé, puis le dernier élément du tableau est remplacé par la partie entière de la chaîne de caractères correspondant à l'expression rationnelle. Si l'expression recherchée contient des parenthèses, l'élément éléments de tableau indexés sur un nombre entier sont définis pour contenir la partie de la chaîne de caractères correspondant aux sous-expressions parenthésées correspondantes. http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

18voto

Daniel Alder Points 425

Si vous n'êtes intéressé que par la dernière ligne d'entrée et que vous vous attendez à ne trouver qu'une seule correspondance (par exemple une partie de la ligne de résumé d'une commande shell), vous pouvez également essayer ce code très compact, adopté à partir de Comment imprimer les correspondances d'expressions rationnelles en utilisant `awk` ? :

$ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}'
yyy

Ou la version plus complexe avec un résultat partiel :

$ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}'
b

Avertissement : le awk match() avec trois arguments n'existe que dans gawk et non en mawk

Voici une autre solution intéressante utilisant un regex de recherche en grep au lieu de awk . Cette solution est moins contraignante pour votre installation :

$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b

18voto

Chris Koknat Points 1732

Si Perl est une option, vous pouvez essayer ceci :

perl -lne 'print $1 if /(regex)/' file

Pour mettre en œuvre la correspondance insensible à la casse, ajoutez l'élément i modificateur

perl -lne 'print $1 if /(regex)/i' file

Pour imprimer tout ce qui se passe APRÈS le match :

perl -lne 'if ($found){print} else{if (/regex(.*)/){print $1; $found++}}' textfile

Pour imprimer le match et tout ce qui suit le match :

perl -lne 'if ($found){print} else{if (/(regex.*)/){print $1; $found++}}' textfile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X