【发布时间】: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!
- grep 路径一致
- 从命令行调用的脚本与在 crontab 中配置的脚本相同
解决方案是使用语法;
value=`/bin/grep -E '^[[:space:]]*mystring:' myfile`
需要三样东西的组合;
- 使用正则表达式时的单引号
- grep -E !扩展正则表达式
- [[:space:]] 代替 \s 用于空格字符
我仍然不确定为什么 [[:space:]] 工作时 \s 不在 crontab 中,当它以交互方式工作时。
【问题讨论】:
-
它是怎么失败的?你用输出做什么?您能否向我们展示完整的配置(crontab + 脚本)并让我们知道您要做什么?
-
你不应该使用
\s。请改用[[:space:]],并用单引号引用您的表达式:/bin/grep -E '^[[:space:]]*mystring' mytextfile -
您在这两个地方都使用
/bin/grep吗?您很可能在 shell 脚本中使用了更高版本的 grep,并且默认支持正则表达式。 -
mytestfile 是否指定为全局路径?还是相对于某物?
-
我试过 [[:space:]] 但没有用 -E。 :)