以下命令按预期工作。
# 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开关,这样它将返回搜索词的所有实例。
答案 0 :(得分:18)
将IGNORECASE = 1;
添加到awk命令的开头,如下所示:
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\>)/), /;/'