以下命令按预期工作.
# 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
/*!*/;
Run Code Online (Sandbox Code Playgroud)
但它只匹配小写"create","alter"等.我想在awk语句中使用IGNORECASE开关,这样它将返回搜索项的所有实例.
And*_*hum 18
IGNORECASE = 1;像这样添加到awk命令的开头:
bash-3.2$ echo "Create" | awk '/^create/;'
bash-3.2$ echo "Create" | awk 'IGNORECASE = 1;/^create/;'
Create
Run Code Online (Sandbox Code Playgroud)
Seb*_*bMa 15
以下行执行OR测试而不是AND:
echo -e "Create\nAny text" | awk 'IGNORECASE = 1;/^create/;'
Create
Create
Any text
Run Code Online (Sandbox Code Playgroud)
BEGIN特殊词解决了这个问题:
echo -e "Create\nAny text" | awk 'BEGIN{IGNORECASE = 1}/^create/;'
Create
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
塞巴斯蒂安.
对于那些老旧awk的IGNORECASE国旗没用的人:
选项1
echo "CreAte" | awk '/^[Cc][Rr][Ee][Aa][Tt][Ee]/'
Run Code Online (Sandbox Code Playgroud)
选项2(谢谢@mwfearnley)
echo "CreAte" | awk 'tolower($0) ~ /^create/'
Run Code Online (Sandbox Code Playgroud)
这有点晚了,但是这个问题的两个 答案(包括接受的答案)提到了做awk 'IGNORECASE=1;...'- 即IGNORECASE=1作为条件放置,而不是块中的语句。
不应该这样做。它确实按预期设置了变量,但它也(意外地)将其评估为布尔表达式,返回 true。
没有块的真条件将导致始终打印该行。如果它碰巧与以下模式匹配,它也会被打印第二次。
接受的答案可能意味着awk '{IGNORECASE=1} ...',它IGNORECASE在每行文本上设置变量。这可以通过使用BEGIN条件只分配一次来进一步改进。但更简洁的解决方案是使用-v标志在脚本逻辑之外设置参数:
awk -v IGNORECASE=1 '/(\<^create\>|\<^alter\>|\<^drop\>)/, /;/'
Run Code Online (Sandbox Code Playgroud)
请注意,这IGNORECASE是特定于 gawk 的。对于非 gawk 特定的方法,GNU Awk 用户指南建议tolower在模式匹配中使用:
awk '(tolower($0) ~ /(\<^create\>|\<^alter\>|\<^drop\>)/), /;/'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29793 次 |
| 最近记录: |