【发布时间】:2017-05-25 20:56:43
【问题描述】:
我无法理解这个 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 部分。
【问题讨论】:
-
into an algorithm是什么意思,你是说进入伪代码吗?或者你只是问它是如何工作的?您可能想尝试阅读手册。 -
你已经被告知 - 这不是 bash,它是 awk。阅读 Arnold Robbins 所著的 Effective Awk Programming,第 4 版。
-
在代码块之后的第一段中专门回答问题,您对
awk '$0 ~ /ab/'的解释是正确的:您提供的代码是有条件的,而 awk 在给定条件时执行的默认操作是{ print $0 },当条件为真时打印整行。 (相比之下,如果您只给它一个块并且没有描述何时运行它的条件,awk将无条件地为每一行输入运行该块。 -
...所以,如果您运行
printf '%s\n' abcd efgh ijkl | awk '$0 ~ /ab/',则只有printf发出的三行中的第一行将依次由awk处理。 -
...
match的棘手之处在于它实际上并没有返回字符串;相反,它返回一个整数,并根据它在哪里找到它正在搜索的正则表达式来设置单独的变量(RSTART、RLENGTH)。见gnu.org/software/gawk/manual/html_node/String-Functions.html
标签: awk