我已过滤掉实时 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
将其值传递给MNR
or$machine_number
和MID
or 。$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"
希望能够澄清双向传递的参数。