[英]ignorecase in 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 開關,以便它返回搜索詞的所有實例。
添加IGNORECASE = 1;
到 awk 命令的開頭,如下所示:
bash-3.2$ echo "Create" | awk '/^create/;'
bash-3.2$ echo "Create" | awk 'IGNORECASE = 1;/^create/;'
Create
以下行執行 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
希望這可以幫助。
塞巴斯蒂安。
對於那些擁有IGNORECASE
標志無用的舊awk
的人:
選項1
echo "CreAte" | awk '/^[Cc][Rr][Ee][Aa][Tt][Ee]/'
選項 2 (感謝@mwfearnley)
echo "CreAte" | awk 'tolower($0) ~ /^create/'
這有點晚了,但是這個問題的兩個答案(包括已接受的答案)提到執行awk 'IGNORECASE=1;...'
- 即把IGNORECASE=1
作為條件,而不是塊中的語句。
不應該這樣做。 它確實按預期設置了變量,但它也(意外地)將其評估為布爾表達式,返回 true。
沒有塊的真條件將導致始終打印該行。 如果它碰巧與以下模式匹配,它也會被打印第二次。
接受的答案可能意味着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\>)/), /;/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.