首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix awk命令

Unix awk命令
EN

Stack Overflow用户
提问于 2013-03-19 23:02:39
回答 2查看 3.1K关注 0票数 2

请帮助我理解下面的awk命令:

代码语言:javascript
复制
awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'

我在帖子中看到了这个命令:awk command to accept two variables as parameters and return a value

上面命令中'$1 ~ var1 && $2 ~ var2; /^var1 var2/‘的用途是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 00:39:44

它应该是:

代码语言:javascript
复制
awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"

这意味着在awk内部,var1将成为外壳变量$1var2将成为$2。在awk内部(在单引号内),还有$1$2,它们表示输入文件中每一行上的字段1和字段2。如果第一个字段($1)与var1中字符串中的正则表达式匹配,$2var2也是如此,则$1 ~ var1 && $2 ~ var2的计算结果为1,并打印输入文件的相应行。

/^var1 var2/表示如果一行以字符串"var1 var2“开头,则打印该行(可能是打印标题)……

票数 4
EN

Stack Overflow用户

发布于 2013-03-20 00:48:20

同时仍在为您的链接中指定的目的工作。

编辑:就像我刚才看到的,你的链接条目似乎已经被修复了。

该命令实际上有点过于复杂,而且(在某种程度上)甚至不正确,正如您已经怀疑的那样。

要理解行$1 ~ var1 && $2 ~ var2; /^var1 var2/的用途,您必须首先理解两个重要的事实。

  • 如果未给出命令,但有匹配的模式,则即使没有显式的print语句,awk也会打印匹配的整行
  • 如果从命令行给出,则必须用;

分隔多个模式

要测试的机器人参数通过-v开关传入,一个获取awk变量var1,另一个获取awk变量var2

$1 ~ var1 && $2 ~ var2将测试第一个字段是否与存储在var1中的正则表达式匹配(此处的~是相关运算符),第二个字段是否与var2中存储的正则表达式匹配。

第二个语句/^var1 var2/是多余的,因为它是不正确的。因为这将匹配以中的文字 "var1“开头的行,后跟文字字符串var2。

它在给出的例子中没有太大的伤害,因为它不会以任何方式匹配,但它仍然是不正确的。

使用正则表达式匹配运算符~而不是利用==进行相等测试是提出的解决方案添加的另一个“不清晰”。

我的建议是直接使用:

代码语言:javascript
复制
awk -v var1="$1" -v var2="$2" '$1==var1 && $2==var2 {print $3}' your-file-here

甚至sparing打开另一个管道只是为了打印存储在字段3中的值。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15503035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档