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

Bash Grep返回的多行结果的最后一次匹配并分配给变量,bash,grep,Bash,Grep,假设我有一个命令list kittens,它在我的终端中以这种多行格式返回一些东西(在这种精确的布局中): 如何获取bob1并分配给变量以供脚本使用?这是我迄今为止的非工作性尝试 list kittens | grep "'([^']+)' \]" 我对cli上的grepping不太熟悉,遇到了带引号的语法问题等。如果您知道bob1将在最后一行,您可以这样捕捉它: myvar="$(list kittens | tail -n1 | grep -oP "'\K[^']+(?=')")" 这将

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

如何获取bob1并分配给变量以供脚本使用?这是我迄今为止的非工作性尝试

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

我对cli上的grepping不太熟悉,遇到了带引号的语法问题等。

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

myvar="$(list kittens | tail -n1 | grep -oP "'\K[^']+(?=')")"
这将使用
tail
查找最后一行,然后使用正则表达式中的前向和后向来提取引号内的部分

Edit:以上假设您正在使用GNU
grep
(用于
-p
模式)。这里有一个使用
sed
的替代方案:

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

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

myvar="$(list kittens | tail -n1 | grep -oP "'\K[^']+(?=')")"
这将使用
tail
查找最后一行,然后使用正则表达式中的前向和后向来提取引号内的部分

Edit:以上假设您正在使用GNU
grep
(用于
-p
模式)。这里有一个使用
sed
的替代方案:

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

可通过
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{}
:END块用于从最后一行获取数据,因为我们只对最后一行感兴趣。
gsub
:这是awk的内置功能,用于搜索和替换任务。此处删除空白、双引号和单引号。并非
\047
用于单报价替换

可以通过
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{}
:END块用于从最后一行获取数据,因为我们只对最后一行感兴趣。
gsub
:这是awk的内置功能,用于搜索和替换任务。此处删除空白、双引号和单引号。并非
\047
用于单报价替换

因此,我遇到了一个问题——我一直在从各种例子中处理这个问题。我在OSX上,所以可能是一个不同的grep-当我运行它时,我会得到一个grep用法转储(用法:grep..等等)。“P”似乎不是一个有效的选项。我有grep(BSD grep)2.5.1-FreeBSDSeems,它只在某些情况下可用。但因为我只有一行,所以我可以用它。谢谢。@Yashua对不起,我不应该假设你有GNU grep,我用sed添加了一个替代解决方案。所以我遇到了一个问题——我从各种例子中处理过这个问题。我在OSX上,所以可能是一个不同的grep-当我运行它时,我会得到一个grep用法转储(用法:grep..等等)。“P”似乎不是一个有效的选项。我有grep(BSD grep)2.5.1-FreeBSDSeems,它只在某些情况下可用。但因为我只有一行,所以我可以用它。谢谢。@Yashua对不起,我不应该假设你有GNU grep,我用sed添加了一个替代解决方案。