GREP:interactive vs crontab

时间:2012-02-16 18:04:45

标签: bash cron grep crontab

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

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

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

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

...感谢您的评论!

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

    解决方案是使用语法;

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

    需要三件事的组合;

    1. 使用正则表达式时的单引号
    2. grep -E!扩展正则表达式
    3. [[:space:]]代替\ s代表空格字符
    4. 我仍然不确定为什么当[s不在crontab中时,[[:space:]]工作,当它以交互方式工作时。

3 个答案:

答案 0 :(得分:0)

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

你可以检查/ etc / crontab的默认值,或者你可以用同样的方式强制它在crontab本身(在日程表上方):

SHELL = /斌/庆典

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

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

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

我正在运行CentOS 6.2

答案 1 :(得分:0)

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

答案 2 :(得分:0)

很抱歉,如果派对迟到了......我在使用完全相同的脚本多年后,egrep发现了一个非常类似的问题。

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

crontab中的

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

我不知道为什么突然改变了。可能是crontabgrep中的更新?

所以,我会看一个env变量问题。其他人也提出了这个问题以及其他变量。