我不是一个BASH和/或grep / AWK专家,所以希望有人可以快速帮助我这个简单的查询。 考虑下面的string:
XenCenter.CustomFields.autostart:120; last_shutdown_time:20120418T11:24:32Z; last_shutdown_action:毁灭; last_shutdown_initiator:external; last_shutdown_reason:暂停; import_task:OpaqueRef:1168d51a-e1ab-b02a-0db7-e6f9bd8fd269; mac_seed:778079d8-5917-c5ce-4800-ee4321f3ed70
如何提取“autostart:120”子串上的“120”位?
注意:上述string中“XenCenter.CustomFields.autostart:120”的位置和/或顺序可能会改变,所以不能依赖它作为第n个字
AWK支持自定义logging和字段分隔符(默认情况下是换行符和空格)。
当我看你的string时,它是一个variables的组合; 和领域:
下面的awk命令设置这些分隔符(RS =logging分隔符,FS =字段分隔符),并检查字段1是否包含(正则expression式)“自动启动”并打印logging的第二个字段:
awk 'BEGIN { RS=";" ; FS=": " } $1 ~ /autostart/ { print $2 }'
在一个shell中,这产生了:
$ echo $STRING | awk 'BEGIN { RS=";" ; FS=": " } $1 ~ /autostart/ { print $2 }' 120
如果你有这个string存储在variablesx ,你可以简单地这样做:
$ echo $x | awk {'print $2'} 120;
为了消除分号,可以使用如下所示的剪切:
$ echo $x | awk {'print $2'} | cut -f1 -d \; 120
这与前一个string有120个空格分隔,并且位于第2个字段(字段)中时保持有效。
假设
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}'
如果你需要为一个var分配tat值作进一步处理,只需在你的脚本中input
VALUE=$(echo $var | nawk -F"[:; ]" '{print $3}')
120将被存储到$ VALUE中
或者一步到位:
$ echo $x | awk -F'[ ;]' '{print $2}'
如果您不确定字段总是按照所示的顺序,那么应该这样工作:
# assuming the line is stored in $x as others have done echo $x | sed -e 's/; /\n/' | grep 'autostart:' | cut -d ' ' -f 2