请帮助我理解下面的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/
”的目的是什么。
答案 0 :(得分:4)
应该是:
awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"
这意味着awk var1
内部变为shell变量$1
而var2
变为$2
。在awk内部(单引号内)还有$1
和$2
,它们表示输入文件中每一行的字段1和字段2。如果第一个字段($1
)与var1
中的字符串中的正则表达式匹配,同样地$2
和var2
匹配,那么$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号字段中的值。