簡體   English   中英

使用grep + regex從輸出中獲取特定值,並將其存儲在shell中的變量中

[英]Fetch specific value from output using grep+regex and store in variable in shell

首先要為這個愚蠢的問題道歉,因為我對此根本不是專家。

我已經完成了以下任務:

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

從這里,我只想獲取所有的價值

為此,我正在嘗試這樣做:

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 '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 (<>) {
    # ...
}

該循環逐行循環遍歷輸入,並且<>已經假定輸入為標准輸入或作為參數指定的文件名。

-e標志位於代碼本身之前:

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

這只是以下內容的簡寫:

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

此處,匹配運算符m// (或簡稱為/<regex> )測試默認變量$_以查看該正則表達式是否匹配。 誰設置了$_變量? 循環本身在其(<>)構造中。 它會自動為每個要讀取的行設置$_

如果正則表達式匹配,我們將打印它的第一組括號(組),其內容設置為$1 如果正則表達式具有其他組,則它們將存儲在$2$3等中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM