Unix-awk命令

Unix-awk命令,unix,awk,Unix,Awk,请帮助我理解以下awk命令: awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}' 我在邮局看到了这个命令: “$1~var1&&$2~var2”的用途是什么/^上述命令中的var1 var2/。应为: awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 v

请帮助我理解以下awk命令:

awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'
我在邮局看到了这个命令:

$1~var1&&$2~var2”的用途是什么/^上述命令中的var1 var2/

应为:

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~var1&&$2~var2/^var1 var2/
旨在让您首先了解两个重要事实

  • 如果没有给出命令,但是模式匹配
    awk
    将打印匹配的整行,即使没有显式的print语句
  • 如果从命令行给出,则必须用
    分隔多个模式
待测试的Bot参数通过
-v
开关传入,一个获取awk变量
var1
,另一个获取awk变量
var2

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

第二条语句
/^var1 var2/
既多余又不正确。 因为这将匹配一行,该行以中的literal“var1”开头,后跟literal字符串var2

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

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

我的建议是只使用:

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

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

我想知道这一行是否正确。。只需打印每一行匹配的内容?(在
之前)不,不应该<代码>$1~var1&$2~var2
不符合规范,而且
/^var1 var2/
绝对错误。@mikyra你是什么意思?不应该什么?我只是试图向OP解释它的含义,而不是它是否是一个好的解决方案。是的,这是不精确的,但这可能是故意的<代码>/^var1 var2/顺便说一句,这不一定是错误的,但它与变量
var1
var2
sry无关,我只是被困在了“它应该是:”的介绍中,因为它可能会得出结论,下面的例子可能就是使用的例子。也许“作者想必是想让它工作的方式”或类似的东西不会让我如此警觉。因为我认为这是误导性的,因为前面的介绍已经解释过了,是的,当然。@mikyra我认为你错了。OP逐字逐句地请求帮助理解awk命令及其目的,这就是我提供的。。