Bash
如果有條件,則在內部重定向 grep 錯誤輸出
我編寫了一個腳本來搜尋*.ini*文件中的某個特定單詞。
.ini文件有兩個不同的名稱之一(比如說config.ini或configuration.ini ),所以我必須同時簽入。
我正在
if
通過使用邏輯來執行以下句子OR
:HAS_SOME_WORD=FALSE if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \ grep -c '\\some_word')" -ge 1 ] \ || [ "$(grep -v '^;\|^\[' "path_to_file/configuration.ini" | \ grep -c '\\some_word')" -ge 1 ]; then HAS_SOME_WORD=TRUE else HAS_SOME_WORD=FALSE fi
我正在避免以*“;”開頭的行* 或*"["因為它們不能包含在所需的搜尋中,同時查找單詞"\some_word"*。
我想要的是在兩個文件之一不存在時排除 grep 錯誤消息,即:
grep: path_to_file/config.ini: No such file or directory
或者:
grep: path_to_file/configuration.ini: No such file or directory
我已經能夠通過將輸出重定向到
/dev/null
執行腳本時來避免它們:./search_script.sh 2>/dev/null
但是,我想將此重定向包含在
if
程式碼本身中,而不是在呼叫腳本時。我該如何實施呢?有沒有更有效的方法來做我正在嘗試的事情?
我試圖添加
-q
參數以grep
避免列印錯誤消息,但它沒有效果。還嘗試2>/dev/null
在每個句子的末尾添加重定向if
,但恐怕我沒有應用正確的語法。
由於
grep
可以搜尋多個文件,並且-v
可以-c
簡化程式碼,請嘗試:cd "path_to file" if grep -qs '^[^;[].*\\some_word' config.ini configuration.ini ; then # ...etc fi cd -
長
grep
格式選項:grep --quiet --no-messages '^[^;[].*\\some_word' \ config.ini configuration.ini
OP 程式碼
-v
(或--invert-match
)和 2ndgrep
是不必要的,因為像^[^;[]
這樣的正則表達式可以一次性完成。來自man grep
:括號表達式是由**[和]括起來的字元列表。它匹配該列表中的任何單個字元;如果列表的第一個字元是插入符號^,則它匹配不在**列表中的任何字元。