我写了一个脚本来搜索.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
这将重定向来自所有命令的错误(都测试-和结果——)在该块内。