当我针对我的服务运行时,我的脚本中得到以下结果。结果因服务而异,但下面显示的文本模式类似。我的脚本的结果被分配给var1。我需要从这个变量中提取数据
$var1=HOST1*prod*gem.dot*serviceList : svc1 HOST1*prod*kem.dot*serviceList : svc3, svc4 HOST1*prod*fen.dot*serviceList : svc5, svc6
我需要从$ var1中删除服务列表的名称。因此,最终结果应打印在单独的行上,如下所示:
svc1
svc2
svc3
svc4
svc5
svc6
你能帮忙吗?
此致
答案 0 :(得分:3)
使用gnu grep和gnu sed:
grep -oP ': *\K\w+(, \w+)?' <<< "$var1" | sed 's/, /\n/'
svc1
svc3
svc4
svc5
svc6
答案 1 :(得分:3)
使用sed和grep:
sed 's/[^ ]* :\|,\|//g' <<< "$var1" | grep -o '[^ ]*'
sed删除冒号和逗号之前的每个非空格。 Grep只是每行输出一个结果服务。
答案 2 :(得分:3)
grep
是完成工作的完美工具。
来自man grep
:
-o, - 仅匹配
仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
听起来很完美!
据我所知,这适用于任何grep
:
echo "$var1" | grep -o 'svc[0-9]\+'
匹配“svc”后跟一个或多个数字。您还可以使用-P
启用“高度实验性”Perl正则表达式模式,这意味着您可以使用\d
数字字符类,而不必再逃避+
:< / p>
grep -Po 'svc\d+' <<<"$var1"
在bash
中,您可以使用{{1>} <一个此字符串),在标准输入上提供<<<
到"$var1"
。
顺便说一句,如果您的数据最初是在不同的行上,例如:
grep
这对HOST1*prod*gem.dot*serviceList : svc1
HOST1*prod*kem.dot*serviceList : svc3, svc4
HOST1*prod*fen.dot*serviceList : svc5, svc6
来说是个不错的选择:
awk