2010-02-19 68 views
6

是否有可能使用存儲在數組中的關鍵字執行grep。是否可以使用存儲在數組中的關鍵字執行grep?

以下是可能的代碼片段...請更正

args=("key1" "key2" "key3") 

cat file_name |while read line 
echo $line | grep -q -w ${args[c]} 
done 

此刻,我可以只搜索一個關鍵字。我想搜索存儲在參數列表數組中的所有關鍵字。

任何建議將不勝感激。

感謝, 基蘭

+1

儘管不是真正的解決方案,但cat用於連接文件,如果只有一個文件,請使用輸入指令: while read line echo $ line | grep -q -w $ {args [c]} done Residuum 2010-02-19 10:13:20

+0

非常感謝..我已經習慣了通過看到其他例子..沒有意識到它.. 感謝噸 – Kiran 2010-02-19 10:29:48

回答

5
args=("key1" "key2" "key3") 
pat=$(echo ${args[@]}|tr " " "|") 
grep -Eow "$pat" file 

或者與外殼

args=("key1" "key2" "key3") 
while read -r line 
do 
    for i in ${args[@]} 
    do 
     case "$line" in 
      *"$i"*) echo "found: $line";; 
     esac 
    done 
done <"file" 
+0

非常感謝..它的工作。 :) – Kiran 2010-02-19 10:31:50

0

或許是這樣的;

cat file_name |while read line 
for arg in ${args[@]} 
do 
echo $line | grep -q -w $arg} 
done 
done 

未經測試!

+0

嗯,我需要搜索兩個關鍵字同時像$ {args [*]}或egrep與多個關鍵字。 有什麼想法? – Kiran 2010-02-19 10:25:05

1

命令

(IFS="|" ; grep --perl-regexp "${args[*]}") <file_name 

搜索數組中的每一個關鍵字的文件。它通過構造正則表達式word1|word2|word3來實現,該正則表達式匹配給定選項(以perl模式)中的任何單詞。

如果我沒有加入數組元素轉換爲字符串的方式,用字符(即,\|),也可能是沒有Perl的正則表達式完成的序列界定他們。

+0

在我的系統上,它是單數:'--perl-regexp'。此外,無用的使用'貓'。 – 2010-02-19 10:31:02

+0

@丹尼斯,謝謝,修正。順便說一句,我可以爭論貓。 – 2010-02-19 10:37:25

+0

'(IFS ... grep ... file_name)' - 不需要重定向。 '--perl-regexp'中的'grep'確實有's'嗎? – 2010-02-19 13:40:50

3

這是一種方式:

args=("key1" "key2" "key3") 
keys=${args[@]/%/\\|}  # result: key1\| key2\| key3\| 
keys=${keys// }   # result: key1\|key2\|key3\| 
grep "${keys}" file_name 

編輯:

基於帕維爾Shved的建議:

(IFS="|"; keys="${args[*]}"; keys="${keys//|/\\|}"; grep "${keys}" file_name) 

第一個版本作爲一個班輪:

keys=${args[@]/%/\\|}; keys=${keys// }; grep "${keys}" file_name 

EDIT2:

甚至比更好的版本使用IFS

printf -v keys "%s\\|" "${args[@]}"; grep "${keys}" file_name 
+0

你能解釋你的解決方案的工作原理嗎?我被困在理解%模式參數[@] /%/ \\ |中的目的 – Sharad 2016-05-25 10:37:58

+0

@Sharad:在Shell Parameter Expansion中查看] Bash手冊](https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion)。在我的示例'keys = $ {args [@] /%/ \\ |}''中的賦值語句用於替換('/')數組每個元素的末尾('%')('args [@]'' )用('/')反斜槓和一個管道('\\ |')。所以它添加了這些字符,因爲「結束」(一個'%'後跟沒有其他字符匹配)就是這樣 - 在這種情況下,在「替換」期間不會刪除字符。 – 2016-05-25 13:25:38

2

你可以使用一些bash的擴張魔法前綴每個元素都帶-e並傳遞陣列的每個元素y作爲一個單獨的模式。這可能會避免一些優先級問題,其中您的模式可能會與|嚴重交互運營商:

$ grep ${args[@]/#/-e } file_name 

這樣做的缺點是您的模式中不能有任何空格,因爲它會將參數拆分爲grep。你不能在上面展開引號,否則你會得到「-e pattern」作爲grep的一個參數。

相關問題