【问题标题】:Fetch specific value from output using grep+regex and store in variable in shell使用 grep+regex 从输出中获取特定值并存储在 shell 中的变量中
【发布时间】:2018-12-13 01:23:11
【问题描述】:

首先为这个愚蠢的问题寻求道歉,因为我根本不是这方面的专家。

我已经完成了如下任务:

image4.png PNG 1656x839 1656x839+0+0 8-bit sRGB 155KB 0.040u 0:00.039
image4.png PNG 1656x839 1656x839+0+0 8-bit sRGB 155KB 0.020u 0:00.030
Image: image4.png
Channel distortion: AE
red: 0
green: 0
blue: 0
all: 0 
image4.png=>tux_difference.png PNG 1656x839 1656x839+0+0 8-bit sRGB 
137KB 0.500u 0:00.140

从这里,我只想得到all

的值

为此,我正在尝试这样做:

var="$(compare -verbose -metric ae path/actual.png path/dest.png path/tux_difference.png 2>&1 | grep 'all:\s(\d*)')"

但它什么也没做。

使用

"sudo apt-get install imagemagick" 

使比较可行。建议对源和目标使用相同的图像,否则会因图像不匹配而出错。

【问题讨论】:

  • 使用grep -oP 'all:\s*\K\d+' 甚至grep -oP '^all:\s*\K\d+$'
  • 现在,执行停止并在控制台中显示 > 。我已经使用 ctrl+c 来阻止它
  • 试试awk -F": " '{if ($1 == "all") {print $2;}}'
  • 不...仍然没有输出... :(

标签: regex shell ubuntu sh


【解决方案1】:

您可能需要在以下位置转义括号(或删除它们):

grep 'all:\s\(\d*\)'

然而 grep 默认会打印整行,这不是你想要的。仅打印匹配的文本是可能的,但从中提取数字需要更复杂的正则表达式,这在您的 grep 版本中可能可用也可能不可用。 GNU grep 有 P 标志来启用 Perl 之类的正则表达式,并且只能使用 o 标志输出匹配。

另一方面,我的建议是直接使用 Perl:

perl -ne 'print $1 if /all: (\d+)/'

请注意,$() 周围也不需要这些引号。考虑到您的 compare 呼叫工作正常并输出您问题中的文本,那么这应该符合您的要求:

var=$( compare [...] | perl -ne 'print $1 if /all: (\d+)/' )
echo $var

如果不能保证数字前的空格不存在,您也可以使用 /all:\s*(\d+)/ 等变体。


这里使用的 Perl 代码主要基于 -n 标志,它假定以下循环围绕程序:

while (<>) {
    # ...
}

这个循环逐行迭代输入,&lt;&gt; 已经假定输入为标准输入或作为参数给出的文件名。

-e 标志位于代码本身之前:

print $1 if /all: (\d+)/;

这只是以下的简写:

if (/all: (\d+)/) {
    print $1;
}

这里的匹配运算符m//(或简称/&lt;regex&gt;)测试默认变量$_ 以查看是否有正则表达式匹配。谁设置了$_ 变量?循环本身在其(&lt;&gt;) 构造中。它会自动将$_ 设置为正在读取的每一行。

如果正则表达式匹配,我们打印它的第一组括号(组),其内容设置为$1。如果正则表达式有其他组,它们将存储在 $2$3 等中。

【讨论】:

  • 这正是我想要的。谢谢......但是你用perl做的事情对我来说似乎很复杂,我必须理解它...... :)
  • 很高兴它为您工作@EricIpsum :) 我刚刚更新了答案,提供了有关 Perl 部分如何工作的信息。我尽量保持简单,而不是过多地介绍 Perl 细节。让我知道是否足够清楚!
猜你喜欢
  • 2021-09-24
  • 2019-03-18
  • 2020-02-07
  • 2013-03-14
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多