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/''