是否有可能使用存儲在數組中的關鍵字執行grep。是否可以使用存儲在數組中的關鍵字執行grep?
以下是可能的代碼片段...請更正
args=("key1" "key2" "key3")
cat file_name |while read line
echo $line | grep -q -w ${args[c]}
done
此刻,我可以只搜索一個關鍵字。我想搜索存儲在參數列表數組中的所有關鍵字。
任何建議將不勝感激。
感謝, 基蘭
是否有可能使用存儲在數組中的關鍵字執行grep。是否可以使用存儲在數組中的關鍵字執行grep?
以下是可能的代碼片段...請更正
args=("key1" "key2" "key3")
cat file_name |while read line
echo $line | grep -q -w ${args[c]}
done
此刻,我可以只搜索一個關鍵字。我想搜索存儲在參數列表數組中的所有關鍵字。
任何建議將不勝感激。
感謝, 基蘭
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"
非常感謝..它的工作。 :) – Kiran 2010-02-19 10:31:50
或許是這樣的;
cat file_name |while read line
for arg in ${args[@]}
do
echo $line | grep -q -w $arg}
done
done
未經測試!
嗯,我需要搜索兩個關鍵字同時像$ {args [*]}或egrep與多個關鍵字。 有什麼想法? – Kiran 2010-02-19 10:25:05
命令
(IFS="|" ; grep --perl-regexp "${args[*]}") <file_name
搜索數組中的每一個關鍵字的文件。它通過構造正則表達式word1|word2|word3
來實現,該正則表達式匹配給定選項(以perl模式)中的任何單詞。
如果我沒有加入數組元素轉換爲字符串的方式,用字符(即,\|
),也可能是沒有Perl的正則表達式完成的序列界定他們。
在我的系統上,它是單數:'--perl-regexp'。此外,無用的使用'貓'。 – 2010-02-19 10:31:02
@丹尼斯,謝謝,修正。順便說一句,我可以爭論貓。 – 2010-02-19 10:37:25
'(IFS ... grep ... file_name)' - 不需要重定向。 '--perl-regexp'中的'grep'確實有's'嗎? – 2010-02-19 13:40:50
這是一種方式:
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
你能解釋你的解決方案的工作原理嗎?我被困在理解%模式參數[@] /%/ \\ |中的目的 – Sharad 2016-05-25 10:37:58
@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
你可以使用一些bash的擴張魔法前綴每個元素都帶-e並傳遞陣列的每個元素y作爲一個單獨的模式。這可能會避免一些優先級問題,其中您的模式可能會與|嚴重交互運營商:
$ grep ${args[@]/#/-e } file_name
這樣做的缺點是您的模式中不能有任何空格,因爲它會將參數拆分爲grep。你不能在上面展開引號,否則你會得到「-e pattern」作爲grep的一個參數。
儘管不是真正的解決方案,但cat用於連接文件,如果只有一個文件,請使用輸入指令: while read line echo $ line | grep -q -w $ {args [c]} done
Residuum
2010-02-19 10:13:20
非常感謝..我已經習慣了通過看到其他例子..沒有意識到它.. 感謝噸 – Kiran 2010-02-19 10:29:48