Utilizando awk
, necesito encontrar una palabra en un archivo que coincida con un patrón de expresión regular.
Yo solamente quiero imprimir la palabra que concordaba con el patrón.
Entonces, si en la línea, tengo:
xxx yyy zzz
Y patrón:
/yyy/
Solo quiero obtener:
yyy
EDITAR: gracias a kurumi 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!
tmp=match($i, /regexp);if(tmp){}
, solo debería poder hacerloif(tmp ~ $i){}
porque~
significa "coincide con la expresión regular".Respuestas:
Este es el muy básico
solicite
awk
buscarpattern
using//
, luego imprima la línea, que por defecto se llama registro, denotado por $ 0. Al menos lee la documentación .Si solo desea imprimir la palabra coincidente.
fuente
print
es la acción predeterminada:awk '/pattern/' file
será suficiente.for
-loop funcione si (a) "yyy" es una expresión regular y no una cadena recta y (b) si ese "yyy" no coincide con un campo completo dentro un registro.$i=="yyy"
; sería$i ~ /yyy/
para una expresión regular.Parece que está intentando emular el
grep -o
comportamiento de GNU . Esto hará que siempre que solo desee la primera coincidencia en cada línea:Aquí hay un ejemplo, usando GNU
awk
implementación (papar moscas):Lea acerca de
match
,substr
,RSTART
yRLENGTH
en elawk
manual.Después de eso, es posible que desee extender esto para tratar con múltiples coincidencias en la misma línea.
fuente
gawk puede obtener la parte correspondiente de cada línea usando esto como acción:
fuente
Si solo está interesado en la última línea de entrada y espera encontrar solo una coincidencia (por ejemplo, una parte de la línea de resumen de un comando de shell), también puede probar este código muy compacto, adoptado de Cómo imprimir coincidencias de expresiones regulares usando `awk`? :
O la versión más compleja con un resultado parcial:
Advertencia: la
awk
match()
función con tres argumentos solo existe engawk
, no enmawk
Aquí hay otra buena solución que usa una expresión regular de búsqueda hacia atrás en
grep
lugar deawk
. Esta solución tiene requisitos más bajos para su instalación:fuente
Si Perl es una opción, puede probar esto:
Para implementar la coincidencia que no distingue entre mayúsculas y minúsculas, agregue el
i
modificadorPara imprimir todo DESPUÉS del partido:
Para imprimir el partido y todo después del partido:
fuente
Usar sed también puede resultar elegante en esta situación. Ejemplo (reemplace la línea con el grupo coincidente "yyy" de la línea):
Página del manual correspondiente: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
fuente
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Fuera del tema, esto también se puede hacer usando grep, simplemente publíquelo aquí en caso de que alguien esté buscando una solución grep
fuente
Si sabe en qué columna está el texto / patrón que está buscando (por ejemplo, "yyy"), puede verificar esa columna específica para ver si coincide e imprimirla.
Por ejemplo, dado un archivo con el siguiente contenido (llamado asdf.txt )
para imprimir solo la segunda columna si coincide con el patrón "yyy", puede hacer algo como esto:
Tenga en cuenta que esto también coincidirá básicamente con cualquier línea donde la segunda columna tenga un "yyy", como estos:
fuente