BASH语法从string中提取参数

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