2016-09-29 48 views
-1

我在寫一個bash腳本來檢查數組元素是否在文件中。檢查數組元素是否在文件中

例如:

我有錯誤的數組errors=("1234" "5678" "9999")

我有一個包含字符串

123400 452612 9999A0 1010EB

我期待的模式來遍歷包含文件的文件錯誤並檢查是否有任何數組元素與文件中的任何字符串模式匹配。如果確實如此,請將它在文件中匹配的確切數組模式返回給我,以供進一步處理。

關於如何做到這一點的任何想法?

+0

文件中有多個行? (或)與這些固定模式只是一條線? – Inian

+0

錯誤可以出現在文件的任何位置嗎? –

+0

錯誤可能出現在文件的任何位置。該文件包含多行,它沒有固定的長度。 –

回答

1

該腳本是這樣的,

#/bin/bash 
errors=("1234" "5678" "9999") 

for error in "${errors[@]}" 
do 
    grep -o "$error" file 
done 

對於一個示例文件,

$ cat file 
123400 452612 9999A0 1010EB 

腳本產生輸出

$ ./script.sh 
1234 
9999 

意味着從陣列上述兩個鍵具有在文件中匹配。 grep中的-o標誌僅用於識別陣列中的匹配部件。摘自man grep頁面。

-o, --only-matching 
     Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 
+0

謝謝伊蓮。正是我在找的 –

2

聽起來像是你只是想要一個循環:

for error in "${errors[@]}"; do 
    if grep -qE "(^|)$error(|\$)" file; then 
     # $error was found in the file 
    fi 
done 

這由線或空間的開始之前的錯誤匹配,並且後面有一個空格或行的末尾。

我作出了努力,錯誤的比賽出場子之內,但如果你不關心,那麼你可以改變grep命令是:

grep -qF "$error" file 

這將返回成功,如果錯誤字符串發生在線上的任何地方。

3

這裏有一個方法,你只需要調用grep一次:

$ grep -oFf <(printf "%s\n" "${errors[@]}") file 
1234 
9999 

-f選項是指定一個包含樣式的文件。我使用進程替換來「包含」模式,每行一個。

-F選項指定純文本匹配:我假設你的「errors」數組不包含正則表達式。