игнорировать в AWK - PullRequest
       10

игнорировать в AWK

20 голосов
/ 08 марта 2011

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

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

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

Ответы [ 4 ]

18 голосов
/ 08 марта 2011

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

bash-3.2$ echo "Create" | awk '/^create/;'
bash-3.2$ echo "Create" | awk 'IGNORECASE = 1;/^create/;'
Create
14 голосов
/ 07 декабря 2015

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

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

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

Себастьен.

8 голосов
/ 13 июля 2012

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

Вариант 1

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

Вариант 2 (спасибо @mwfearnley)

echo "CreAte" | awk 'tolower($0) ~ /^create/'
2 голосов
/ 30 сентября 2018

Это немного поздно, но в двух ответах здесь (включая принятый ответ) упоминается выполнение awk 'IGNORECASE=1;...', то есть установка IGNORECASE=1 в качестве условия вместо оператора в блоке.

Это должноне будет сделаноОн устанавливает переменную как задумано, но также (как непреднамеренно) оценивает ее как логическое выражение, возвращая true.

Истинное условие без блока приведет к тому, что строка будет всегда печататься.Если он соответствует следующему шаблону, он также будет напечатан во второй раз.

То, что, вероятно, означал принятый ответ, было awk '{IGNORECASE=1} ...', которое устанавливает переменную IGNORECASE в каждой строке текста.Это можно улучшить, используя условие BEGIN, чтобы назначить его только один раз.Но более чистое решение - использовать флаг -v для установки параметра вне логики скрипта:

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

Обратите внимание, что IGNORECASE относится к gawk.Для не специфичного для gawk метода в руководстве пользователя GNU Awk предлагается использовать tolower в сопоставлении с образцом:

awk '(tolower($0) ~ /(\<^create\>|\<^alter\>|\<^drop\>)/), /;/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...