Bash AWK查找多个模式并分配给不同的变量

时间:2018-12-21 09:07:55

标签: linux bash shell perl awk

我目前有一个变量,其值类似于:

x_snd_user=''
x_snd_appli=''
x_snd_text=''
x_rcv_user=''
x_rcv_appli=''
x_rcv_text=''
x_dup_from_xfer='0'
x_route_from_xfer='0'
x_route_to_xfer='0'
x_reply_by_xfer='0'
x_reply_to_xfer='0'
x_routed_to_XIB='N'
x_end_xfer_script=''
x_ftp_command=''

例如,如何匹配3个模式(x_snd_appli, x_route_from_xfer, x_ftp_command),格式化这些模式(awk -F"'" '{print $2}')并将它们分配给不同的变量?

例如,我有一些变量,想要将输出分配给这些变量:

 - Application= The value of <x_snd_appli>
 - Route= The value of <x_route_from_xfer>
 - Command= The value of <x_ftp_command>

最好不要安装一些不需要安装的东西。 因此,如果可能的话,最好使用AWK / perl。

该变量的完整内容非常大(大约45行)。 当我运行脚本1x时,它的运行时间可能约为1000x。 因此,我不想将数据写入文件/循环超过10次以awk / grep不同的值并将它们分配给变量。

2 个答案:

答案 0 :(得分:1)

您已经拥有一个有效的Shell脚本。您可以直接获取它:

$ source ./file
$ echo $x_dup_from_xfer
0

要重新分配,可以使用一些sed / awk,例如:

$ eval $(sed -n 's/^x_route_from_xfer=/Route=/p' file)
$ echo $Route
0

-n关闭行的自动打印,并且s替换,p打印替换结果。多个sed命令:

$ eval $(sed -n 's/^x_route_from_xfer=/Route=/p;s/.../.../p' file)

但是请注意,源和评估要求由您控制文件内容。

输入也可能来自变量:

eval $(sed ... <<< "$var")

答案 1 :(得分:0)

怎么样:

#!/bin/bash

transfer="
x_snd_user=''
x_snd_appli=''
x_snd_text=''
x_rcv_user=''
x_rcv_appli=''
x_rcv_text=''
x_dup_from_xfer='0'
x_route_from_xfer='0'
x_route_to_xfer='0'
x_reply_by_xfer='0'
x_reply_to_xfer='0'
x_routed_to_XIB='N'
x_end_xfer_script=''
x_ftp_command=''
"
# or assign "transfer" with a output of other command.

while read -r line; do
    eval "$line"
done < <(
awk -F= 'BEGIN {
    a["x_snd_appli"] = "Application"
    a["x_route_from_xfer"] = "Route"
    a["x_ftp_command"] = "Command"
    }
    a[$1] {print a[$1] "=" $2}
' <<< "$transfer"
)

echo "Application=$Application"
echo "Route=$Route"
echo "Command=$Command"

使用eval时,我们需要特别注意。