文件不包含字符串时如何使用grep


26

在我的bash脚本中,如果文件中不存在某个字符串,我将尝试打印一行。

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

如果我希望该字符串存在于文件中,这就是我写的方式,但是如果在/ etc / passwd文件中找不到该用户,该如何更改它以使其显示“用户不存在”?

Answers:


49

grep如果找到至少一个模式实例,将返回成功,否则将返回失败。因此,else如果您希望同时打印“确实”和“不想要”,则可以添加一个子句,也可以否定if条件以仅获得失败。每个示例:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi

2

另一种方法是查找的退出状态grep。例如:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

如果grep未能找到匹配它会退出1,所以$?1。如果成功,grep将始终返回0。因此,使用起来$? != 0比更加安全$? == 1


这实际上是说埃里克所说的更长的方式。
杰夫·谢勒

好吧,对我来说,否定性if ! grep ...陈述是行不通的。所以这是另一种选择。
ssanch '18

1

我用一个简单的衬里解决它:

for f in *.txt; do grep "tasks:" $f || echo $f; done

该命令将检查目录中所有具有txt扩展名的文件,如果发现则写搜索字符串(即“ tasks:”),否则将写文件名。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.