awk y regex con {}

0

Quiero imprimir todo el registro si contiene palabras y algunos caracteres, que son opcionales. Guión:

/mount[ein]{0,2}/{
print $0}

Lamentablemente no funciona. Sin "{" y "}" funciona. Intenté con "\" antes de "{":

/mount[ein]\{0,2\}/{
    print $0}

Otro ejemplo Para archivo:

mountx
mounte
mountee
mounteee

Awk:

awk '/mount[ein]{0,2}$/' file

Y resultado:

//nada

Sistema: Debian 7.8 Linux ibm 3.2.0-4-amd64 # 1 SMP Debian 3.2.68-1 + deb7u1 x86_64 GNU / Linux

diego9403
fuente
Muestre su entrada y salida deseada.
John1024
La entrada es un texto (parte del libro). Solo quiero saber por qué regex no funciona. Son {} no funcionan en awk.
diego9403
1
¿Qué te hace creer que la expresión regular no funciona? Sin decir la entrada, la salida esperada y la salida real, es difícil para nosotros adivinar.
jlliagre

Respuestas:

0

Su expresión regular funciona tanto con un POSIX compatible awkcomo con GNU awk.

Dado el hecho de que los caracteres e, iy ndeben estar presentes de cero a tres veces, pero que no hay más restricciones, esta parte se puede eliminar del patrón como mountsigue cualquier cosa o nada coincide de todos modos. print $0No es necesario especificar la acción ( ) que también es la predeterminada.

Su comando puede entonces simplificarse para:

awk '/mount/'

Si desea que se use el rango, debe especificar algo después, aquí hay un ejemplo:

$ cat input
foo
mountx
mounte
mountee
mounteee
$ /usr/xpg4/bin/awk '/mount[ein]{0,2}$/' input
mounte
mountee

Es decir en Solaris donde el POSIX awkestá en /usr/xpg4/bin.

Mismo comportamiento en la Mint 17.1 basada en Debian:

$ awk -V | head -1      
GNU Awk 4.0.1
$ awk '/mount[ein]{1,2}$/' input     
mounte
mountee

Sin embargo, parece que mawk, que afirma el cumplimiento POSIX, no admite la expresión de intervalo (llave).

$ mawk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
$ mawk '/mount[ein]{1,2}$/' input
$ 

Este es un error conocido .

jlliagre
fuente
Copié su entrada y comando, pero en mi Debian no funciona. Pero sin "{}" awk muestra el resultado, ¿quizás hay algo mal con mi sistema operativo?
diego9403
Nuevamente, explique lo que quiere decir con "no funciona", es decir, el comando real ejecutado, su entrada, su salida esperada y su salida real.
jlliagre
Lo siento. La salida no es esto lo que sospecho. Creo que se debe a la expresión regular, porque intento otro sin "{}". Ayer revisé el mismo script en otro sistema (Slackware) y funciona, así que creo que hay algo mal con mi Debian. Incluso puedo copiar la secuencia de comandos y Debian no mostró nada,
diego9403
Edite su pregunta con los detalles solicitados: qué versión de awk está ejecutando en ese Debian, qué resultado obtiene con qué comando y qué entrada.
jlliagre
Una razón para que el comando no muestre nada podría ser que las líneas de entrada terminen con CRLF (estilo Windows) vs LF (estilo Unix). Pruebaawk '/mount[ein]{1,2}\r$/' input
jlliagre
2

Ejemplo tst.txt:

mountx
mounte
mountee
mounteee

script awk (GNU Awk 3.1.7)

awk --re-interval '/mount[ein]{0,2}$/' tst.txt > tst1.txt

resultado

mounte
mountee

hombre awk

-W re-interval
--re-interval
          Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).  Interval expressions were not traditionally available in the AWK
          language.  The POSIX standard added them, to make awk and egrep consistent with each other.  However, their use is likely to break old AWK programs, so  gawk  only  pro-
          vides them if they are requested with this option, or when --posix is specified.
ДядюшкаАУ
fuente
0

No estoy seguro acerca de su formato de comando de montaje, y la pregunta aparece como una pregunta "awk", sin awk en su comentario.

¿Es esto lo que estás buscando?

"imprime todas las líneas que contienen un 0" (o cualquier cadena que estés buscando) desde un archivo - usa el comando

cat temp.txt | grep 0 | awk '{print $0}'

resultará en

0 9 8 7 6 5 4 3 2

5 4 3 2 1 0 9 8

donde temp.txt es

1 2 3 4 5 6 7

0 9 8 7 6 5 4 3 2

9 8 7 6 5 4

8 7 6 5 4 3

7 6 5 4 3

6 5 4 3

5 4 3 2 1 0 9 8

4 4

3

2

WillW
fuente
El resultado está bien, pero tengo que escribirlo completamente en un script awk y no sé por qué "{}" no funciona. ¿Sabes por qué mi expresión regular no funciona?
diego9403
No sin saber qué es / mount [ein]
WillW
"mount" <- esta es la palabra, que es constante, pero los caracteres ein pueden estar en línea, pero no es necesario y 3 caracteres (ein) pueden repetirse cero, una o dos veces.
diego9403