在AWK中忽略

sha*_*nuo 23 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
/*!*/;
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)

  • 将它设置在`BEGIN`块或命令行中,因为不需要为每行输入执行它. (15认同)
  • 请注意,这是一种"gawk"主义.而对于丹尼斯的第二点,他的意思是:'awk'/一堆正则表达式/'IGNORECASE = 1` (5认同)
  • 正如@ceykooo所说,这也不适合我.但这对我有用:`echo"不匹配"| awk'tolower($ 0)〜/ ^ create /'` (3认同)
  • 将其设置在BEGIN块或任何块中,或者它无法正常工作.当它不在<code> {} </ code>块中时,所有文本行都在gawk 3.1.6和4.1.1中匹配,并且可能是普遍的.IE <code> echo -e"a \nb \nc"| awk'IGNORECASE = 1;/B /' - </ code>输出包含a,b,b,c的四行!<code> echo -e"a \nb \nc"| awk'BEGIN {IGNORECASE = 1}/B /' - </ code>只输出一行包含b. (3认同)
  • 这至少在awk版本20070501中不起作用.`echo"不匹配"| awk'IGNORECASE = 1;/^ create /;'`给出'不匹配'.如果除了正则表达式之外还有其他内容,它似乎不会添加隐式if语句. (2认同)
  • 仅供参考,使用`mawk`时,这对我来说不起作用.我安装了`gawk`,这个世界现在都是正确的...... (2认同)
  • 只是说,我把这个答案记下来了。上面给出了大概的原因,但对我来说,这是因为它在应该在块中或设置为“gawk -v”变量时将“IGNORECASE = 1”评估为条件表达式。作为一个条件,它将导致每行出现隐式的“{print $0}”。 (2认同)

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)

希望这可以帮助.

塞巴斯蒂安.

  • 这与其说是 OR 测试,不如说它只是评估两个表达式(其中一个总是评估为真),因此将每个输入行打印一次或两次。 (2认同)

Jua*_*doy 8

对于那些老旧awkIGNORECASE国旗没用的人:

选项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 的人` ...比如 mac 用户:( (2认同)
  • 只是说,https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html 建议在非 GNU awks 中使用 `tolower($0) ~ /.../`。 (2认同)

mwf*_*ley 8

这有点晚了,但是这个问题的两个 答案(包括接受的答案)提到了做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)