web-dev-qa-db-ja.com

AWKのignorecase

次のコマンドは期待どおりに機能しています。

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

しかし、それは小文字の「作成」、「変更」などにのみ一致します。awkステートメントでIGNORECASEスイッチを使用して、検索語のすべてのインスタンスを返すようにしたいと思います。

23
shantanuo

追加 IGNORECASE = 1;をawkコマンドの先頭に次のように追加します。

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

次の行は、ANDの代わりにORテストを実行します。

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

お役に立てれば。

セバスチャン。

16
SebMa

古いawkがあり、IGNORECASEフラグが役に立たない場合:

オプション1

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

オプション2(@mwfearnleyに感謝)

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

これは少し遅いですが、ここで2つの回答(承認された回答を含む)はawk 'IGNORECASE=1;...'、つまりIGNORECASE=1ブロック内のステートメントではなく、条件として。

これはすべきではありません。意図したとおりに変数を設定しますが、(意図しない)変数をブール式として評価し、trueを返します。

ブロックのない真の状態では、行が常に印刷されます。次のパターンと一致する場合は、2回目に印刷されます。

受け入れられた答えがおそらく意味したのは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\>)/), /;/'
3
mwfearnley