我不是 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