【问题标题】:Bash AWK find multiple patterns and assign to different variablesBash AWK 查找多个模式并分配给不同的变量
【发布时间】:2019-05-21 18:10:36
【问题描述】:

我目前有一个包含类似以下值的变量:

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 不同的值并将它们分配给变量。

【问题讨论】:

  • 请将该示例输入的所需输出添加到您的问题中。
  • 你去吧,我有 3 个变量要存储输出。(实际上我有大约 15 个变量,文本文件更大,所以这只是一个示例输出。)
  • 你不能直接在脚本中分配变量名,比如:Application="The value of $(grep -o "x_snd_appli" /path/file_name)" 等等其他...?
  • 你可以像这样使用declaredeclare $(awk 'BEGIN{print "var1=x\nvar2=y"}')然后echo $var1echo $var2。替换你自己的 awk 东西,但你明白了。
  • 通过 shell 循环运行文件并使用 Awk 反复提取单个字段是一种非常常见的反模式,而整个过程作为一个完整的 Awk 脚本将是优雅而微不足道的。你能告诉我们一些你想用这些变量做的事情吗?

标签: linux bash shell perl awk


【解决方案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")

【讨论】:

  • 好主意,但是我不能应用它。我想我一开始就错了,说我有一个输入文件,这些值已经在一个变量中,我读取了变量并需要解析它。无法将其写入文件(需要不断写入/读取的数据太多)。
  • @DaanTheunis 输入来自哪里并不重要。见编辑。
【解决方案2】:

怎么样:

#!/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 时需要特别注意。

【讨论】:

  • 这看起来很有希望,但是在使用变量作为输入时似乎不起作用?正如脚本所做的那样......什么都没有,只是保持黑色:transfer=`output from application command` while read -r line; do eval "$line" done &lt; &lt;( awk -F= 'BEGIN { a["x_destination"] = "destination" } a[$1] {print a[$1] "=" $2} ' "$transfer" ) echo $destination
  • 我已经针对通过变量提供输入的情况修改了脚本。你能测试一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2012-12-12
相关资源
最近更新 更多