En utilisant awk
, j'ai besoin de trouver un mot dans un fichier qui correspond à un modèle regex.
Moi seulement veux imprimer le mot correspondant au motif.
Donc, si dans la ligne, j'ai:
xxx yyy zzz
Et motif:
/yyy/
Je veux seulement obtenir:
yyy
EDIT: grâce à kurumi, j'ai réussi à écrire quelque chose comme ceci:
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!
tmp=match($i, /regexp);if(tmp){}
, vous devriez simplement pouvoir le faireif(tmp ~ $i){}
parce que~
signifie «correspond à l'expression rationnelle».Réponses:
C'est le très basique
demandez
awk
de rechercherpattern
using//
, puis imprimez la ligne, qui par défaut est appelée un enregistrement, notée $ 0. Au moins, lisez la documentation .Si vous souhaitez uniquement imprimer le mot correspondant.
la source
print
c'est l'action par défaut:awk '/pattern/' file
suffira.for
boucle si (a) "yyy" est une expression régulière et non une chaîne droite et (b) si ce "yyy" ne correspond pas à un champ entier dans un enregistrement.$i=="yyy"
; ce serait$i ~ /yyy/
pour une expression régulière.Il semble que vous essayez d'imiter le
grep -o
comportement de GNU . Cela fera cela à condition que vous ne vouliez que la première correspondance sur chaque ligne:Voici un exemple, en utilisant GNU
awk
implémentation (rester bouche bée):En savoir plus
match
,substr
,RSTART
etRLENGTH
dans leawk
manuel.Après cela, vous souhaiterez peut-être étendre cela pour traiter plusieurs correspondances sur la même ligne.
la source
gawk peut obtenir la partie correspondante de chaque ligne en utilisant ceci comme action:
la source
Si vous n'êtes intéressé que par la dernière ligne d'entrée et que vous prévoyez de ne trouver qu'une seule correspondance (par exemple une partie de la ligne récapitulative d'une commande shell), vous pouvez également essayer ce code très compact, adopté depuis Comment imprimer les correspondances de regexp en utilisant `awk`? :
Ou la version plus complexe avec un résultat partiel:
Attention: la
awk
match()
fonction à trois arguments n'existe que dansgawk
, pas dansmawk
Voici une autre solution intéressante utilisant une expression régulière lookbehind au
grep
lieu deawk
. Cette solution a des exigences moindres pour votre installation:la source
Si Perl est une option, vous pouvez essayer ceci:
Pour implémenter la correspondance insensible à la casse, ajoutez le
i
modificateurPour tout imprimer APRÈS le match:
Pour imprimer le match et tout après le match:
la source
L'utilisation de sed peut également être élégante dans cette situation. Exemple (remplacez la ligne par le groupe correspondant "yyy" de la ligne):
Page de manuel pertinente: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
la source
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Hors sujet, cela peut être fait en utilisant le grep également, il suffit de le poster ici au cas où quelqu'un chercherait une solution grep
la source
Si vous savez dans quelle colonne se trouve le texte / motif que vous recherchez (par exemple "yyy"), vous pouvez simplement vérifier cette colonne spécifique pour voir si elle correspond et l'imprimer.
Par exemple, étant donné un fichier avec le contenu suivant, (appelé asdf.txt )
pour n'imprimer que la deuxième colonne si elle correspond au modèle "yyy", vous pouvez faire quelque chose comme ceci:
Notez que cela correspondra également à n'importe quelle ligne où la deuxième colonne contient un "yyy", comme ceci:
la source