Unix awk命令

时间:2013-03-19 15:02:39

标签: unix awk

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

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/”的目的是什么。

2 个答案:

答案 0 :(得分:4)

应该是:

awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"

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

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

答案 1 :(得分:-1)

虽然仍在为您的链接中指定的目的工作。

编辑:因为我刚看到您的链接条目似乎已在此期间修复。

这个命令有点过于复杂,并且(在某种程度上)甚至是你已经怀疑的错误。

要了解第$1 ~ var1 && $2 ~ var2; /^var1 var2/行的意图,您必须首先了解两个重要事实。

  • 如果没有给出命令但模式匹配awk将打印匹配的整行,即使没有明确的打印语句
  • 如果从命令行给出,则必须用;
  • 分隔多个模式

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

$1 ~ var1 && $2 ~ var2将测试两者(这就是&&运算符的用途)第一个字段与存储在var1中的正则表达式匹配(~正在这里的relavant运算符)和第二个字段匹配存储在var2中的正则表达式。

第二个陈述/^var1 var2/是多余的,因为它是不正确的。 因为这会匹配以文字“var1”开头的行,然后是文字字符串var2。

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

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

我的建议是使用:

awk -v var1="$1" -v var2="$2" '$1==var1 && $2==var2 {print $3}' your-file-here

甚至不用打开另一个管道来打印存储在第3号字段中的值。