在AWK中忽略

时间:2011-03-08 05:55:15

标签: 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”等。我想在awk语句中使用IGNORECASE开关,这样它将返回搜索词的所有实例。

4 个答案:

答案 0 :(得分:18)

IGNORECASE = 1;添加到a​​wk命令的开头,如下所示:

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

答案 1 :(得分:14)

以下行执行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

希望这有帮助。

的Sebastien。

答案 2 :(得分:8)

对于那些awk IGNORECASE标志无效的人:

选项1

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

选项2 (感谢@mwfearnley)

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

答案 3 :(得分:2)

这有点晚了,但是这里有两个答案(包括已接受的答案)提到了做awk 'IGNORECASE=1;...',即以IGNORECASE=1为条件,而不是在语句中插入一个语句。

不应该这样做。它确实按预期设置了变量,但是(出于意外)它也将其评估为布尔表达式,返回true。

没有遮挡的真实条件将导致始终打印该行。如果碰巧与以下图案匹配,则也会再次打印。

可接受的答案可能是awk '{IGNORECASE=1} ...',它在每一行文本上设置IGNORECASE变量。通过使用BEGIN条件仅将其分配一次,可以进一步改善此条件。但是更干净的解决方案是使用-v标志在脚本逻辑之外设置参数:

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

请注意,IGNORECASE特定于gawk。对于非特定于gawk的方法,GNU Awk User's Guide建议在模式匹配中使用tolower

awk '(tolower($0) ~ /(\<^create\>|\<^alter\>|\<^drop\>)/), /;/'