使用sed或AWK进行文本操作

时间:2014-04-25 14:08:37

标签: 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中删除服务列表的名称。因此,最终结果应打印在单独的行上,如下所示:

svc1 
svc2
svc3
svc4
svc5
svc6

你能帮忙吗?

此致

3 个答案:

答案 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