Regex crontab中的grep无法正常工作

Regex crontab中的grep无法正常工作,regex,bash,cron,grep,Regex,Bash,Cron,Grep,我有一个脚本,它使用两个单独的grep语句: grep -E "GET[^\"]*\.html" tmp.cleaned.log | grep -v "XMLHttpRequest" | wc -l 以及 它将结果值存储在输出日志文件中。当我在shell提示符下手动运行脚本时,我得到了两条语句的正确结果:680和10028 但是,当我使用crontab调度脚本时,第一行返回正确的值680,而第二行的结果是0 我已经重定向了stderr和stdout,并且似乎没有记录错误。 除了脚本本身中的sh

我有一个脚本,它使用两个单独的grep语句:

grep -E "GET[^\"]*\.html" tmp.cleaned.log | grep -v "XMLHttpRequest" | wc -l
以及

它将结果值存储在输出日志文件中。当我在shell提示符下手动运行脚本时,我得到了两条语句的正确结果:680和10028

但是,当我使用crontab调度脚本时,第一行返回正确的值680,而第二行的结果是0

我已经重定向了stderr和stdout,并且似乎没有记录错误。 除了脚本本身中的shebang之外,我还在crontab中添加了SHELL=/bin/bash。 crontab用于root用户,如下所示:

SHELL=/bin/bash
16      */1     *       *       *       /u02/sites/webstats/rundaily.sh
脚本首先将目录更改到正确的位置,因此它不是路径问题;此外,这两条语句都引用相同的文件和可执行文件

试图解决这个问题真的快把我逼疯了。任何帮助都将不胜感激

谢谢

更新

我想我已经弄明白了为什么我得了0分。我的表情有一个缺陷。应该是的

grep -E "^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-]+\"" tmp.cleaned.log | wc -l
而不是

grep -E "^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-\\]+\"" tmp.cleaned.log | wc -l
这就是它返回0(没有匹配项)的原因。然而,它仍然不能解释为什么我在cron和shell中看到不同的结果。现在我意识到10028的值是tmp.cleaned.log的总行数

所以, 当从shell执行时,grep表达式返回所有行,但它与使用错误正则表达式的任何行都不匹配。 当从cron执行相同的错误正则表达式时,grep正确地返回了零行


我仍然对理解这种行为差异感兴趣。

我想你会发现这种差异是由语言环境造成的:

line='A"B" "C" "D" "E"'
regex="^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-\\]+\""

LC_COLLATE=en_US.utf8 grep -E "$regex" <<< "$line"  # MATCH
LC_COLLATE=C grep -E "$regex" <<< "$line"           # NO MATCH
line='A“B”C“D”E'
regex=“^[^\”]+\“[^\”]+\“\”[^\“]+\“\”[^\“]+\“\”[^\“-\]+\”“”

LC_COLLATE=en_US.utf8 grep-E“$regex“您是直接在crontab中执行grep,还是在crontab调用的脚本中执行grep?始终在crontab调用的脚本中执行grep。我尝试了两种不同的方法,一种是直接从crontab调用脚本。crontab调用脚本的另一个脚本依次调用另一个脚本。在这两种情况下,结果都是相同的。您是正确的,因为我在shell hadLANG=en_US.UTF-8中的环境。。。而从crontab获得的环境没有。结果也与您所指出的一致。我还使用您的代码测试了我的更改(从上一个排除类中删除\\),结果再次与您的建议一致。但我不确定我是否理解其中的道理。为什么尝试排除\会导致不匹配OK。我现在明白了。我试图排除“、-”和\。然而,我构建上一个排除的方式将其解释为“-\(即“to”)。这与A-Z在该范围内或之外的组合导致了错误匹配或匹配。哇,一个位置不正确的连字符。。。
line='A"B" "C" "D" "E"'
regex="^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-\\]+\""

LC_COLLATE=en_US.utf8 grep -E "$regex" <<< "$line"  # MATCH
LC_COLLATE=C grep -E "$regex" <<< "$line"           # NO MATCH