如何使用shell脚本在给定文件中查找行? 文件名是/etc/crontab。内容在这里:
17 */1 * * * root /opt/first.sh
*/1 * * * * root /opt/second.sh
grep -q "*/1 * * * * root /opt/second.sh" /etc/crontab
我使用了上面的命令并且 $?
代码是1而不是0.
那有什么不对?如果您有其他方式,请告诉我。谢谢!
答案 0 :(得分:2)
使用
grep -q "\*/1 \* \* \* \* root /opt/second.sh" /etc/crontab ## will grep correct line and give success
否则会更正
grep -q "*/1 * * * * root /opt/second.sh" /etc/crontab ## will grep nothing and still return success code
答案 1 :(得分:1)
要匹配文字星号,您必须告诉grep这个星号是文字的。
为此,您需要使用[
和]
封装星号
它现在看起来像这样:
grep -q "[*]/1 [*] [*] [*] [*] root /opt/second.sh" /etc/crontab
答案 2 :(得分:1)
如果您想匹配固定字符串,最简单的方法是使用-F
选项:
$ grep -F "*/1 * * * * root /opt/second.sh" crontab
*/1 * * * * root /opt/second.sh
或者,要仅获取退出代码,请添加-q
:
$ grep -qF "*/1 * * * * root /opt/second.sh" crontab ; echo code=$?
code=0
通常,grep
会将搜索字符串解释为正则表达式。这意味着*
或.
或+
等字符处于活动状态。 -F
关闭该功能,以便将搜索字符串视为一个普通的固定字符串。
*/ * * * * root /opt/second.sh
观察*/ * * * * root /opt/second.sh
匹配的内容:
$ echo '*/ root /opt/second.sh' | grep '*/ * * * * root /opt/second.sh'
*/ root /opt/second.sh
但是,以下内容不匹配:
$ echo '*/ * root /opt/second.sh' | grep '*/ * * * * root /opt/second.sh'
$
*
被视为零个或多个前面的字符。因此,* * * *
匹配零个或多个空格。它与星星不匹配。
grep
特别在正则表达式的开头处理一个明星。由于*
表示前面一个字符的零个或多个,并且开头的*
没有前面的字符,因此没有意义。许多程序都会出错。相比之下,grep
将*
解释为在这种特殊情况下的字面明星。