重定向命令

重定向命令

我写了一个脚本来搜索.ini文件某些特定的单词。

.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

我正在避免以以下开头的行“;”或者“[”因为在查找单词时它们不得包含在所需的搜索中“\一些_词”

我想要的是当两个文件之一不存在时排除 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,但恐怕我没有应用正确的语法。

答案1

由于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)和第二个grep是不必要的,因为像 regexp 这样的东西^[^;[]可以一次性完成。从man grep

括号表达式是由括起来的字符列表[]。它匹配该列表中的任何单个字符;如果列表的第一个字符是插入符号^然后它匹配任何字符不是在列表中。

答案2

其他答案,建议--no-messages/ -s更适合您的问题,但以下内容也适用于没有“静默”选项的命令。

重定向命令

重定向错误简单的命令,您应该使用该命令进行重定向,即。在管道中的相同位置:

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" 2>/dev/null | \
  grep -c '\\some_word')" -ge 1 ] \

第一个grep是生成“没有这样的文件或目录”消息的消息,因此这是必须重定向的消息。

重定向管道

如果管道的多个部分可能生成错误,您可以将整个管道放在一个团体,后面有一个重定向:

if [ "$( ( grep -v '^;\|^\[' "path_to_file/config.ini" | \
  grep -v -f "path_to_file/ignored_patterns" | \
  grep -c '\\some_word' )  2>/dev/null )" -ge 1 ] \

重定向条件构造

您可以重定向整个if 构造通过在结束之后放置重定向fi

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \
    grep -c '\\some_word')" -ge 1 ] \
 ...
else
 ...
fi 2>/dev/null

这将重定向来自所有命令的错误(都测试-结果——)在该块内。

相关内容