Grep返回多行结果的最后一个匹配并分配给变量

时间:2016-09-23 01:38:52

标签: bash grep

假设我有一个命令list kittens,它在我的终端中以这种多行格式返回一些东西(在这个确切的布局中):

[ 'fluffy'
  'buster'
  'bob1' ]

如何获取 bob1 并分配给变量以供脚本使用?到目前为止,这是我的非工作尝试。

list kittens | grep "'([^']+)' \]"

我并不太熟悉grei on cli并且遇到带引号等语法的问题。

2 个答案:

答案 0 :(得分:1)

如果您知道bob1将在最后一行,您可以像这样捕获它:

myvar="$(list kittens | tail -n1 | grep -oP "'\K[^']+(?=')")"

这使用tail查找最后一行,然后grep使用前瞻和正则表达式中的lookbehind来提取引号内的部分。

编辑:以上假设您使用的是GNU grep(适用于-P模式)。这是sed的另一种选择:

myvar="$(list kittens | tail -n1 | sed -e "s/^[^']*'//; s/'[^']*$//")"

答案 1 :(得分:1)

可以由awk单独完成:

list kittens |awk 'END{gsub(/\047|[[:blank:]]|\]/,"");print $0}'
bob1

示例:

 echo "$kit"
[ 'fluffy'
  'buster'
  'bob1' ]
echo "$kit"  |awk 'END{gsub(/\047|[[:blank:]]|\]/,"");print $0}'
bob1

将其分配给任何变量:

var=$(list kittens |awk 'END{gsub(/\047|[[:blank:]]|\]/,"");print $0}'

解释

END{}:结束块用于从最后一行获取数据,因为我们只对最后一行感兴趣。 gsub:这是用于搜索和替换任务的awk's内置函数。这里删除了空格和双引号和单引号。并非\047用于单引号替换。