separador practicos examples ejemplos campos awk

practicos - awk unix



ignorecase en AWK (4)

Añadir IGNORECASE = 1; al comienzo de tu comando awk así:

bash-3.2$ echo "Create" | awk ''/^create/;'' bash-3.2$ echo "Create" | awk ''IGNORECASE = 1;/^create/;'' Create

El siguiente comando está funcionando como se esperaba.

# some command | awk ''/(/<^create/>|/<^alter/>|/<^drop/>)/,/;/'' create table todel1 (id int) max_rows=2 /*!*/; alter table todel1 engine=InnoDB /*!*/; create database common /*!*/; create database rules /*!*/;

Pero coincide solo con la minúscula "crear", "alterar", etc. Quiero usar el interruptor IGNORECASE en la instrucción awk para que devuelva todas las instancias del término de búsqueda.


Esto es un poco tarde, pero dos respuestas aquí (incluida la respuesta aceptada) mencionan hacer awk ''IGNORECASE=1;...'' , es decir, poner IGNORECASE=1 como condición, en lugar de una declaración en un bloque.

Esto no debe hacerse. Establece la variable según lo previsto, pero también (como no intencional) la evalúa como una expresión booleana, devolviendo verdadero.

Una condición verdadera sin un bloque hará que la línea siempre se imprima. Si coincide con el siguiente patrón, también se imprimirá una segunda vez.

Lo que probablemente significó la respuesta aceptada fue awk ''{IGNORECASE=1} ...'' , que establece la variable IGNORECASE en cada línea de texto. Esto se puede mejorar aún más utilizando la condición BEGIN para asignarla solo una vez. Pero una solución más limpia es usar el indicador -v para establecer el parámetro fuera de la lógica del script:

awk -v IGNORECASE=1 ''/(/<^create/>|/<^alter/>|/<^drop/>)/, /;/''

Tenga en cuenta que IGNORECASE es específico de gawk. Para un método no específico de gawk, la gnu.org/software/gawk/manual/html_node/… sugiere usar tolower en una coincidencia de patrón:

awk ''(tolower($0) ~ /(/<^create/>|/<^alter/>|/<^drop/>)/), /;/''


La siguiente línea ejecuta una prueba OR en lugar de un AND:

echo -e "Create/nAny text" | awk ''IGNORECASE = 1;/^create/;'' Create Create Any text

La palabra especial BEGIN solucionó el problema:

echo -e "Create/nAny text" | awk ''BEGIN{IGNORECASE = 1}/^create/;'' Create

Espero que esto ayude.

Sebastien.


Para aquellos que tienen un antiguo awk donde la bandera IGNORECASE es inútil:

Opción 1

echo "CreAte" | awk ''/^[Cc][Rr][Ee][Aa][Tt][Ee]/''

Opción 2 (gracias @mwfearnley)

echo "CreAte" | awk ''tolower($0) ~ /^create/''