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:以上假设您正在使用GNUgrep
(用于-p
模式)。这里有一个使用sed
的替代方案:
myvar="$(list kittens | tail -n1 | sed -e "s/^[^']*'//; s/'[^']*$//")"
如果您知道
bob1
将位于最后一行,您可以这样捕获它:
myvar="$(list kittens | tail -n1 | grep -oP "'\K[^']+(?=')")"
这将使用tail
查找最后一行,然后使用正则表达式中的前向和后向来提取引号内的部分
Edit:以上假设您正在使用GNUgrep
(用于-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添加了一个替代解决方案。