【问题标题】:GREP: interactive vs crontabGREP:交互式 vs crontab
【发布时间】:2012-03-08 03:55:45
【问题描述】:

我有一个简单的文本文件,我正在使用 BASH 脚本监控更改。 我要查找的文本可能从行首开始或被空格偏移。 我的搜索很简单;

#!/bin/bash
value=`/bin/grep "^\s*mystring:" mytextfile`
echo "found: [$value]" >> myoutput.log

这在命令行上运行时可以正常工作,但如果从 crontab 中配置的脚本调用则不起作用。我有一个解决问题的方法,但仍然无法解释为什么在 crontab 中调用 grep 时同时使用插入符号 (^) 和空格 (\s*) 字符?

更改 PATH 和环境似乎没有任何影响。有什么想法吗?

...感谢 cmets!

  1. grep 路径一致
  2. 从命令行调用的脚本与在 crontab 中配置的脚本相同

解决方案是使用语法;

value=`/bin/grep -E '^[[:space:]]*mystring:' myfile`

需要三样东西的组合;

  1. 使用正则表达式时的单引号
  2. grep -E !扩展正则表达式
  3. [[:space:]] 代替 \s 用于空格字符

我仍然不确定为什么 [[:space:]] 工作时 \s 不在 crontab 中,当它以交互方式工作时。

【问题讨论】:

  • 它是怎么失败的?你用输出做什么?您能否向我们展示完整的配置(crontab + 脚本)并让我们知道您要做什么?
  • 你不应该使用\s。请改用[[:space:]],并用单引号引用您的表达式:/bin/grep -E '^[[:space:]]*mystring' mytextfile
  • 您在这两个地方都使用/bin/grep 吗?您很可能在 shell 脚本中使用了更高版本的 grep,并且默认支持正则表达式。
  • mytestfile 是否指定为全局路径?还是相对于某物?
  • 我试过 [[:space:]] 但没有用 -E。 :)

标签: bash cron grep crontab


【解决方案1】:

对不起,如果聚会有点晚了……我刚刚发现 egrep 有一个非常相似的问题,经过多年完美地使用相同的脚本。

原来是LANG 环境变量问题。如果我 egrep 为 'blablabla',它在控制台和 crontab 中都可以正常工作。但是,如果我搜索“blablablá”,后者会失败,但前者不会(我在任何地方都使用 Latin1 编码)。

crontab 中的printenv 给了我LANG=en_US.UTF-8,而在控制台中我没有设置LANG env 变量。因此,解决方案是将LANG="" 添加到我的 crontab 文件中。问题解决了。

我不知道为什么它突然改变了。 crontabgrep 可能有更新?

所以,我会看一个环境变量问题。其他人也提出了这个建议,还有其他变量。

【讨论】:

    【解决方案2】:

    通常,当我将 grep 用于正则表达式时,我会尝试确保包含一个标志,告诉它处理正则表达式,或者运行执行相同操作的“egrep”。

    【讨论】:

    • 我不明白你的回答。 AFAIK,grep 总是搜索正则表达式;它的名字是g/re/p 的缩写,一个ed 命令“全局搜索re 并打印”。唯一的问题是它使用哪种正则表达式方言,您可以使用-E(扩展正则表达式)或-F(固定字符串)标志(或者基本正则表达式都不是)来控制它。但它们都是正则表达式。 (grep 的某些版本支持 PCRE — 也兼容 Perl 的正则表达式。)
    • 嗯,正则表达式有不同种类的(标准),你可以告诉 grep 你想遵守哪一种。所以这就是我的意思。
    【解决方案3】:

    如果您可以在命令行的 shell 脚本中运行这些命令并且它可以工作,但不能在 crontab 中运行,那么我的猜测是 crontab 的默认 SHELL 变量未设置为与您的 shell 相同的 shell在命令行中使用。会是这样吗?

    您可以在 /etc/crontab 中检查默认值,或者您可以在 crontab 本身(在时间表之上)以相同的方式强制它:

    SHELL=/bin/bash

    我的设置为 /bin/bash,我可以像这样使用你的脚本:

    • 创建 /tmp/test.sh 并在其中包含您的代码
    • 创建了 /tmp/mytextfile,其中包含“mystring:”行,然后是更多随机字符的测试行。
    • 在我的 crontab 中创建了以下条目:*/1 * * * * (cd /tmp; /bin/bash test.sh)
    • 跟踪文件 myoutput.log 并等待 1 分钟。

    found: [ mystring:] 的行每分钟都会出现一次。所以它奏效了。

    我正在运行 CentOS 6.2

    【讨论】:

    • 嗯,对我不起作用。我正在使用 CentOS 5.6 版(最终版)我的 crontab 中有 SHELL=/bin/bash 但我使用的行是; */1 * * * * root (cd /tmp; /bin/bash /tmp/test.sh)
    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2021-08-27
    • 2019-09-18
    • 1970-01-01
    • 2015-10-22
    • 2018-01-13
    • 2020-08-15
    • 2013-04-16
    相关资源
    最近更新 更多