2011-04-04 22 views
60

Usando awk, necesito encontrar una palabra en un archivo que coincida con un patrón de expresiones regulares.¿Cómo imprimir el patrón de expresiones regulares coincidentes usando awk?

I solo quiero imprimir la palabra que coincide con el patrón.

lo tanto, si en la línea, que tienen:

xxx yyy zzz 

Y patrón:

/yyy/ 

quiero sólo para obtener:

yyy 

EDIT: gracias a ku rumi i logró escribir algo como esto:

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

y esto es lo que necesitaba :) muchas gracias!

+2

leí esto, y esto es demasiado geek para mí: S – marverix

+2

entonces yo sugeriría usted para proporcionar un poco más detalles de tu tarea Es muy vago –

+0

@maxtaldykin ¿Podrías pasar tu auto-respuesta de la pregunta a una respuesta por separado, por favor? – kenorb

Respuesta

85

Esto es lo más básico

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

piden awk para buscar pattern usando //, luego imprima la línea, que por defecto se llama un registro, denotado por 0 $. Al menos lee el documentation.

Si solo desea imprimir la palabra coincidente.

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

Dado que 'print' es la acción predeterminada:' awk '/ pattern /' file' será suficiente. – Johnsyweb

+13

@Johnsyweb, sí, sí sé este hecho. Para un principiante como Marverix, su intención es ser más visual. – kurumi

+8

No dudo de su conocimiento. Sin embargo, la información puede ser útil para que otros encuentren esta respuesta. – Johnsyweb

71

Parece que está intentando emular el comportamiento de grep -o de GNU. Esto va a hacer que la provisión sólo desea que el primer partido en cada línea:

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

He aquí un ejemplo:

% 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 

Para el resto de su tarea, usted debe buscar lo que cada uno de match, substRSTART y RLENGTH en el manual awk.

Después de eso, es posible que desee extender esto para tratar con múltiples coincidencias en la misma línea.No puedo hacer todos su tarea para usted :-)

+0

NB: Para responder a esa última parte, todas las construcciones necesarias están en [respuesta de kurumi] (http://stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from -file/5536068 # 5536068) y el mío. – Johnsyweb

+0

Gran respuesta. Solo quiero una explicación aquí porque soy flojo. ¡Pero es por eso que estoy usando AWK! –

+0

¿Qué sucede si quiero hacer algo con el resultado del juego, excepto si lo imprimo? Por ejemplo, quiero agregar todas las coincidencias en la matriz. – Evya2005

8

Si solo está interesado en la última línea de entrada y espera encontrar una sola coincidencia (por ejemplo, una parte de la línea de resumen de un intérprete de comandos) de comandos), también puede probar este código muy compacto, adoptado de Print regexp matches in AWK:

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

O la versión más compleja con un resultado parcial:

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

Advertencia: la awkmatch() función con tres argumentos sólo existe en gawk, no en mawk

Aquí es otra buena solución utilizando un lookbehind regex en grep en lugar de awk. Esta solución tiene requisitos más bajos para su instalación:

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

Gawk puede obtener la parte coincidente de cada línea usando esto como una acción:

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

partido (cadena, expresión regular [, array]) Si la matriz está presente, se borra, y luego el elemento zeroth de la matriz se establece en la porción completa de cadena coincidente con regexp. Si regexp contiene paréntesis, los elementos indexados enteros de la matriz están configurados para contener la porción de la cadena que coincide con la subexpresión entre paréntesis correspondiente. http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

8

Si Perl es una opción, puede intentar esto:

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