次のコマンドは期待どおりに機能しています。
# 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スイッチを使用して、検索語のすべてのインスタンスを返すようにしたいと思います。
追加 IGNORECASE = 1;
をawkコマンドの先頭に次のように追加します。
bash-3.2$ echo "Create" | awk '/^create/;'
bash-3.2$ echo "Create" | awk 'IGNORECASE = 1;/^create/;'
Create
次の行は、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
お役に立てれば。
セバスチャン。
古い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\>)/), /;/'