我无法理解这个awk代码:
$0 ~ ENVIRON["search"] {
match($0, /id=[0-9]+/);
if (RSTART) {
print substr($0, RSTART+3, RLENGTH-3)
}
}
~
和match()
运营商之间如何互动?
match()
如果没有打印或回显输出会有什么影响?它实际返回或做什么?如何在我自己的代码中使用它?
这与Why are $0, ~, &c. used in a way that violates usual bash syntax docs inside an argument to awk?有关,但这个问题集中在理解bash和awk语法之间的区别,而这个问题集中在理解脚本的awk部分。
答案 0 :(得分:3)
一次提出一个问题:
~
和match()
运营商如何互相互动?他们没有。至少不要直接在你的代码中。 ~
是正则表达式比较运算符。在$0 ~ ENVIRON["search"]
的上下文中,它用于测试环境变量search
中包含的正则表达式是否作为当前记录($0
)的一部分存在。如果确实如此,则执行后续{...}
块中的代码,如果它没有,那么它就不会。
match()
如果输出没有打印或如何产生任何影响
呼应?它标识起始点(并将其存储在awk变量RSTART
中)和第一个参数(RLENGTH
)中第一个子字符串的长度($0
) regexp提供第二个参数(id=[0-9]+
)。使用GNU awk,它还可以填充第3个数组参数,其中匹配字符串的段由圆括号标识(又名"捕获组")。
返回RSTART
的值,如果未找到匹配则为零,否则为1或更大。它的作用看到了之前的答案。
如您所发布的示例所示,这是一种方式,但该代码通常更多地写为:
($0 ~ ENVIRON["search"]) && match($0,/id=[0-9]+/) {
print substr($0, RSTART+3, RLENGTH-3)
}
并且使用字符串而不是第一部分的正则表达式比较可能更合适:
index($0,ENVIRON["search"]) && match($0,/id=[0-9]+/) {
print substr($0, RSTART+3, RLENGTH-3)
}
获取由Arnold Robbins撰写的Effective Awk Programming,第4版,以学习如何使用awk。
答案 1 :(得分:-2)
id=[0-9]+
在每行中找到匹配项id=
这个更短但是也一样:
xinput --list | grep -Po 'id=[0-9]+' | cut -c4-