Bash 使用sed或AWK进行文本操作

Bash 使用sed或AWK进行文本操作,bash,awk,sed,var,Bash,Awk,Sed,Var,当我对我的服务运行脚本时,我在脚本中得到以下结果。结果因服务而异,但下面显示的文本模式类似。脚本的结果被分配给var1。我需要从这个变量中提取数据 $var1=HOST1*prod*gem.dot*serviceList : svc1 HOST1*prod*kem.dot*serviceList : svc3, svc4 HOST1*prod*fen.dot*serviceList : svc5, svc6 我需要从$var1中删除服务列表的名称。因此,最终结果应打印在单独的行上,如下所

当我对我的服务运行脚本时,我在脚本中得到以下结果。结果因服务而异,但下面显示的文本模式类似。脚本的结果被分配给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
你能帮个忙吗


关于使用gnu grep和gnu sed:

grep -oP ': *\K\w+(, \w+)?' <<< "$var1" | sed 's/, /\n/'
svc1
svc3
svc4
svc5
svc6
使用sed和grep:

sed 's/[^ ]* :\|,\|//g' <<< "$var1" | grep -o '[^ ]*'
sed删除冒号和逗号前的所有非空白。Grep每行只输出一个结果服务。

Grep是完成这项工作的完美工具

来自man grep:

-o、 -仅匹配 仅打印匹配行中匹配的非空部分,每个此类部分位于单独的输出行上

听起来很完美

据我所知,这将适用于任何grep:

匹配svc,后跟一个或多个数字。您还可以使用-P启用高度实验性的Perl regexp模式,这意味着您可以使用\d数字字符类,而不必再转义+了:

grep -Po 'svc\d+' <<<"$var1"
这对awk来说是一份好工作:


输出中的svc2来自哪里?它不存在于示例datagrep-Po'svc[^]*'文件中?@anishsane,它在svc3之后留下一个。grep-Po'svc\d'可以工作,但如果假定在某一点上,此数据位于单独的行上,这是否公平?而不仅仅是查找svc。它可以是svc以外的任何东西。谢谢,没问题。老实说,看起来有来自其他地方的数据行,冒号后面有逗号分隔的值。如果是这样的话,我建议使用awk。我添加了一个示例来说明我的意思above@theuniverseisflat当前位置“不”是什么意思?表示grep不产生任何结果。。第一部分是非空白部分——如果可以的话。当我通过管道传输并使用grep命令时。。我什么也得不到。它没有列出任何内容-空白-娜达-zilch@theuniverseisflat:你的grep支持-o吗?您可以通过xxd或hexdump运行第一部分的输出吗?是的,grep支持-o选项。我使用的命令如下:echo$var1 | sed的//[^]*:\\\\;,\\\;//g'@theuniverseisflat:删除echo部分。那是什么
grep -Po 'svc\d+' <<<"$var1"
HOST1*prod*gem.dot*serviceList : svc1 
HOST1*prod*kem.dot*serviceList : svc3, svc4    
HOST1*prod*fen.dot*serviceList : svc5, svc6
awk -F': ' '{split($2,a,", "); for (i in a) print a[i]}'