Bash

如果有條件,則在內部重定向 grep 錯誤輸出

  • January 31, 2017

我編寫了一個腳本來搜尋*.ini*文件中的某個特定單詞。

.ini文件有兩個不同的名稱之一(比如說config.iniconfiguration.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

括號表達式是由**[]括起來的字元列表。它匹配該列表中的任何單個字元;如果列表的第一個字元是插入符號^,則它匹配不在**列表中的任何字元。

引用自:https://unix.stackexchange.com/questions/341196