使用 AWK 在 shell 中定义变量

使用 AWK 在 shell 中定义变量

我已过滤掉实时 MQTT 流并将其转储到 CSV 文件中。我使用 CSV 文件中的第四个参数 ( $4) 和第五个参数 ( $5) 来查找我想要的信息。我将此信息提供给 awk (即$machine_ID$machine_number),以便它找到具有我定义的参数的最新数据。代码如下所示:

engine_hours=`awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`

engine_hours通过 MySQL 发送以更新与$machine_ID和对应的表$machine_number。所以基本上我选择何时更新哪台机器。

现在,我想将$5和分别$4将其值传递给MNRor$machine_numberMIDor 。$machine_ID我将在其中连接它们以创建$machine_name变量。

所以代码应该是这样的:

engine_hours=`awk -F, '( MID = $4 ) && ( MNR = $5 ) && ( $7 == "status" ) -v "$machine_ID"=MID -v "$machine_number"=MNR  {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`

我得到的错误是awk: line 1: syntax error at or near =

我该如何补救?

答案1

一般来说,要将 awk 计算或提取的变量传递给 shell,您需要遵循以下编码模式...

shell_var=$( awk '{ ...some processing... ; print awk_var }' )

如果你有多个变量,你可以做...

eval "$( awk '{ ...some processing... ; print "shell_var1="awk_var1, "shell_var2="awk_var2 }' )"

代码说明: shell 模式var=$( awk '...' )会将 awk 进程将打印的任何内容分配给 shell 变量。由于您只能分配一个值,这意味着您需要采用不同的方法来分配两个或多个变量。一种方法是让 awk 打印整个作业,例如awk '{ print "varname=" value }'; shell 构造$( ... )将再次扩展到嵌入 awk 调用的输出,在本例中是赋值。要激活扩展的赋值 shell 命令,您需要 shell 指令来评估它;eval是执行此操作的命令。与第一个(简单)情况的区别在于,您可以让 awkeval一次打印多个作业(用空格分隔)。

我将给出一个带有输入和输出变量以及一些计算的示例......

number=42
square=$( awk -v NUM="$number" 'BEGIN{ print NUM*NUM }' )
echo "$square"

希望能够澄清双向传递的参数。

相关内容