awk如何匹配和〜运算符一起工作?

时间:2017-05-24 19:55:25

标签: awk

我无法理解这个awk代码:

$0 ~ ENVIRON["search"] {
  match($0, /id=[0-9]+/);
  if (RSTART) {
    print substr($0, RSTART+3, RLENGTH-3)
  }
}
  1. ~match()运营商之间如何互动?

  2. match()如果没有打印或回显输出会有什么影响?它实际返回或做什么?如何在我自己的代码中使用它?

  3. 这与Why are $0, ~, &c. used in a way that violates usual bash syntax docs inside an argument to awk?有关,但这个问题集中在理解bash和awk语法之间的区别,而这个问题集中在理解脚本的awk部分。

2 个答案:

答案 0 :(得分:3)

一次提出一个问题:

  1. ~match()运营商如何互相互动?
  2. 他们没有。至少不要直接在你的代码中。 ~是正则表达式比较运算符。在$0 ~ ENVIRON["search"]的上下文中,它用于测试环境变量search中包含的正则表达式是否作为当前记录($0)的一部分存在。如果确实如此,则执行后续{...}块中的代码,如果它没有,那么它就不会。

    1. match()如果输出没有打印或如何产生任何影响 呼应?
    2. 它标识起始点(并将其存储在awk变量RSTART中)和第一个参数(RLENGTH)中第一个子字符串的长度($0) regexp提供第二个参数(id=[0-9]+)。使用GNU awk,它还可以填充第3个数组参数,其中匹配字符串的段由圆括号标识(又名"捕获组")。

      1. 实际返回或做什么?
      2. 返回RSTART的值,如果未找到匹配则为零,否则为1或更大。它的作用看到了之前的答案。

        1. 如何在我自己的代码中使用它?
        2. 如您所发布的示例所示,这是一种方式,但该代码通常更多地写为:

          ($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]+在每行中找到匹配项
  • 如果匹配的起始位置(RSTART)不为0,则:
  • 在没有id=
  • 的情况下打印匹配项

这个更短但是也一样:

xinput --list | grep -Po 'id=[0-9]+' | cut -c4-