Ignorecase в AWK

Следующая команда работает как ожидалось.

# 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
/*!*/;

Но он соответствует только нижнему регистру "create", "alter" и т.д. Я хочу использовать IGNORECASE-переключатель в выражении awk, чтобы он возвращал все экземпляры поискового запроса.

Ответ 1

Добавьте IGNORECASE = 1; в начало вашей команды awk следующим образом:

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

Ответ 2

Следующая строка выполняет тест OR вместо AND:

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

Специальное слово BEGIN решило проблему:

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

Надеюсь, что это поможет.

Себастьен.

Ответ 3

Другой вариант для тех, у кого есть старый awk, где флаг IGNORECASE бесполезен:

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