2014-02-09 72 views
0

我有元件的陣列中的一個列表(例如。XML標籤)數組中的元素的列表的文件,並且如果我是通過文件和提取匹配的行的列表,以搜索它們到一個臨時file.What是一個好方法?搜索通過使用外殼

這裏是我的腳本嘗試:

myArray =(ZZ1 BZ1 ZZ2 AZ1 AZ2) 

echo "${myArray[@]}" 

while read line 
do 
if [[ "$line" =~ ${myArray[@]} ]];then 
     echo $line | awk -F "[><]" '{print $2"|"$3}' 
fi 
done < file.xml 

感謝所有的信息:

但下面的比較 - 「$行」 =〜$正則表達式是通過掃描該文件,並取所有的數據,以及我正在尋找的數據如何過濾它們?

回答

0

該腳本將通過file.xml搜索在myArray尋找任何字符串的任何事件:

#!/bin/bash 
myArray=(ZZ1 BZ1 ZZ2 AZ1 AZ2) 

regex="$(echo "(${myArray[@]})" | sed 's/ /|/g')" 

while read line 
do 
if [[ "$line" =~ $regex ]];then 
     echo $line | awk -F "[><]" '{print $2"|"$3}' 
fi 
done < file.xml 

由於=~做一個正則表達式匹配,關鍵的變化上面是myArray轉換爲合適的正則表達式:(ZZ1|BZ1|ZZ2|AZ1|AZ2)

由於這個問題提供了從file.xml也不期望輸出既不樣品輸入,我不知道awk命令你想要做什麼或沒有。

+0

但上面的比較 - 「$ line」=〜$ regex正在掃描整個文件並獲取所有數據以及我正在查看的數據,如何過濾它們? – user3290453

+0

@ user3290453它不應該那樣做。您可以嘗試將'echo $ regex'行添加到您的腳本中,並驗證正則表達式類似於上面的。如果是這樣,那麼告訴我它通過什麼樣的路線,你不想要。 – John1024

+0

其工作感謝約翰 – user3290453

0

你不需要在外殼循環,能做到這一點在AWK本身。

myArray=(ZZ1 BZ1 ZZ2 AZ1 AZ2) 
re=$(printf "%q|" "${myArray[@]}") 

awk -F "[><]" -v re="(${re%|*})" '$0 ~ re {print $2"|"$3}' file.xml 
+0

如果它的工作,然後考慮標記答案被接受。 – anubhava