2016-03-04 46 views
0

我正在嘗試編寫一個簡單的bash腳本,該腳本將grep爲二進制文件中的字符串,然後使用正則表達式提取所有十六進制字符串。但是,我似乎無法找到一種方法,可以將來自正則表達式的輸出存儲在一個數組中,我可以稍後使用它將其所有元素從十六進制轉換爲ASCII值。將正則表達式的匹配結果存儲在數組中

str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib); 
hexstr=$([[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]); 
converted=$(xxd -r -p <<< "$HEXSTR"); 
echo -e "\e[92m$converted \e[0m" 

我可以做一個if聲明以while循環中它會創建一個十六進制字符串(從正則表達式返回)作爲元素的數組?

UPDATE


當前代碼:

#!/bin/bash 

str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib); 

if [[ $str =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then 
     Array+="$str" 
fi 

for hex in "${Array[@]}"; do 
     echo $hex 
done 
+0

爲了將它添加到數組中,您必須像'Arrary + =(「$ str」)''一樣在'$ str'周圍有括號。 – jkdba

+1

'=〜'不支持lookaround正則表達式 – anubhava

回答

3

可以將值這樣在bash添加到一個數組:通過數組

Array+=("$hexstr") 

然後可以循環像這樣:

for hex in "${Array[@]}"; do 
     #perform operation to convert hex here 
     converted="$(xxd -r -p <<< "$hex")" 
done 

要更正if match邏輯,您可以創建類似的語句,以便設置$hexstr變量。

if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then 
     hexstr="$STR" 
fi 

把這個在一起應該是這樣的:

if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then 
     Array+=("$STR") 
fi 

###Do work 
###Use For loop etc 

如果你想縮短你的代碼更(更少的代碼少的機會,打破),你可以做所有的匹配在grep和加入這樣的數組:

Array=($(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib | grep -oP "(?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}])")) 
##Do For loop 

以上將執行你的grep和只找到匹配的行那麼它將只獲取正則表達式的匹配值和各存儲在數組中。

+0

我按照推薦的方式執行了循環:'for $ in array $ {Array [@]}「;做 轉換=「$(xxd -r -p <<<」$ hex「)」 echo -e「\ e [92m $ converted \ e [0m」 done' 但是,我想我存儲的方式$ hexstr中正則表達式的結果是錯誤的。現在它在執行時不會返回任何內容。 – McJohnson

+0

@McJohnson更新了我的答案。 – jkdba

+0

用修改後的代碼更新了問題。它再次沒有返回。 grep的工作,問題似乎是存儲正則表達式的結果。在這種情況下是否實際使用'=〜'操作符?正則表達式本身工作正常,在https://regex101.com/r/eT2pG2/3 – McJohnson