BASH 语法从字符串中提取参数

BASH 语法从字符串中提取参数

我不是 BASH 和/或 grep/AWK 专家,所以希望有人能快速帮助我完成这个简单的查询。考虑以下字符串:

XenCenter.CustomFields.autostart:120;last_shutdown_time:20120418T11:24:32Z;last_shutdown_action:销毁;last_shutdown_initiator:外部;last_shutdown_reason:停止;import_task:OpaqueRef:1168d51a-e1ab-b02a-0db7-e6f9bd8fd269;mac_seed:778079d8-5917-c5ce-4800-ee4321f3ed70

如何提取“autostart: 120”子字符串上方的“120”位?

注意:上述字符串中“XenCenter.CustomFields.autostart: 120”的位置和/或顺序可能会发生变化,因此不能依赖它是第 n 个单词

答案1

AWK 支持自定义记录和字段分隔符(默认分别为换行符和空格)。

当我查看您的字符串时,它是用分隔符分隔的变量;和用分隔符分隔的字段的组合:

以下 awk 命令设置这些分隔符(RS = 记录分隔符,FS = 字段分隔符)并检查字段 1 是否包含(正则表达式)“autostart”并打印记录的第二个字段:

awk 'BEGIN { RS=";" ; FS=": " } $1 ~ /autostart/ { print $2 }'

在 shell 中,这将产生:

$ echo $STRING | awk 'BEGIN { RS=";" ; FS=": " } $1 ~ /autostart/ { print $2 }'
120

答案2

如果将此字符串存储在变量中x,则可以简单地执行以下操作:

$ echo $x | awk {'print $2'}
120;

要消除分号,可以使用 cut 如下:

$ echo $x | awk {'print $2'} | cut -f1 -d \;
120

当 120 与前一个字符串之间用空格隔开并且位于第二个位置(字段)时,此方法仍然有效。

答案3

假设

var="XenCenter.CustomFields.autostart: 120; last_shutdown_time: 20120418T11:24:32Z; last_shutdown_action: Destroy; last_shutdown_initiator: external; last_shutdown_reason: halted; import_task: OpaqueRef:1168d51a-e1ab-b02a-0db7-e6f9bd8fd269; mac_seed: 778079d8-5917-c5ce-4800-ee4321f3ed70"

你可以通过以下方式提取 120

echo $var | nawk -F"[:; ]" '{print $3}'

如果你需要将 tat 值分配给 var 以进行进一步处理,只需在脚本中输入此代码

VALUE=$(echo $var | nawk -F"[:; ]" '{print $3}')

并且 120 将存储到 $VALUE 中

答案4

如果您不确定字段是否始终按照显示的顺序排列,则应该使用如下方法:

# assuming the line is stored in $x as others have done
echo $x | sed -e 's/; /\n/' | grep 'autostart:' | cut -d ' ' -f 2

相关内容