如何在文件中找到一行?

时间:2015-07-31 06:23:21

标签: shell unix

如何使用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.

那有什么不对?如果您有其他方式,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:2)

  • 在unix中被视为wild字符。即使在“*”中,*也会完成它的工作。

使用

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*解释为在这种特殊情况下的字面明星。