Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在文件中查找行?_Shell_Unix - Fatal编程技术网

Shell 如何在文件中查找行?

Shell 如何在文件中查找行?,shell,unix,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 那怎么了?。如果你有别的办法,请告诉我。谢谢 在unix中被视为通配符。即使在“*”中,*也能完成它的工作 使用 否则它会纠正的 g

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

那怎么了?。如果你有别的办法,请告诉我。谢谢

  • 在unix中被视为通配符。即使在“*”中,*也能完成它的工作
使用

否则它会纠正的

grep -q "*/1 * * * * root /opt/second.sh" /etc/crontab  ## will grep nothing and still return success code
  • 在unix中被视为通配符。即使在“*”中,*也能完成它的工作
使用

否则它会纠正的

grep -q "*/1 * * * * root /opt/second.sh" /etc/crontab  ## will grep nothing and still return success code

要匹配文字星号,您必须告诉grep该星号是文字星号

为此,您需要用
[
]

现在看起来是这样的:

grep -q "[*]/1 [*] [*] [*] [*] root /opt/second.sh" /etc/crontab

要匹配文字星号,您必须告诉grep该星号是文字星号

为此,您需要用
[
]

现在看起来是这样的:

grep -q "[*]/1 [*] [*] [*] [*] root /opt/second.sh" /etc/crontab

如果要匹配固定字符串,最简单的方法是使用
-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
特别对待正则表达式开头的星号。由于
*
表示零个或多个前置字符,且开头的
*
没有前置字符,因此没有意义。许多程序都会给出一个错误<相比之下,code>grep
在这种特殊情况下将
*
等解释为文字星形。

如果要匹配固定字符串,最简单的方法是使用
-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
特别对待正则表达式开头的星号。由于
*
表示零个或多个前置字符,且开头的
*
没有前置字符,因此没有意义。许多程序都会给出一个错误<相比之下,code>grep
*
等解释为在这种特殊情况下是一个字星号。

您得到的错误是什么?我想使用
grep-q“*/1****root/opt/second.sh”/etc/crontab
命令,通过
$?
判断文件是否具有“*/1****根/opt/second.sh”行。但是,它始终是1而不是0。您得到的错误是什么?我想使用
grep-q“*/1****root/opt/second.sh”/etc/crontab
命令来判断文件是否为
/etc/crontab
具有“*/1****root/opt/second.sh”行。但是,它始终是1而不是0。