写了以下所有内容,然后注意到您的 grep 语句。
回想一下,ksh 不支持将.. 作为“扩展此值范围”的指标。 (我认为这是你的意图)。由于您没有引用 grep 的参数,这也变得模棱两可。如果您使用的是 shell 将转换的语法,那么您将不会真正知道将什么 reg-exp 发送到 grep。总是最好引用参数,除非您确定需要未引用的值。尝试重写为
grep '1[1-6]:[0-9][0-9]' | grep '24.12.2012'
另外,您是否故意使用“匹配任何字符”运算符“。”还是您只想匹配句点字符?如果您只想匹配一个句点,那么您需要像\. 一样对其进行转义。
最后,如果您正在处理的任何文件是在 Windows 机器上创建的,然后传输到 Unix/Linux,则很可能是行尾 (Ctrl-MCtrl-J) (\r\n) 导致你的问题。使用dos2unix file [file2 ...] 清理基于 PC 的文件(或任何通过 ftp 发送的文件)。
如果上述方法没有帮助,您将不得不“分而治之”来调试您的问题。
当我进行以下测试时,我得到了预期的输出
$ echo "var1" | while read line ; do print "line=${line}" ; done
line=var1
$ vi Test.txt
$ cat Test.txt
var1
$ cat Test.txt | while read line ; do print "line=${line}" ; done
line=var1
与您的问题无关,但肯定会引起评论的是您在这种情况下使用cat commnad,这将为您带来 UUOC 奖。可以改写为
while read line ; do print "line=${line}" ; done < Test.txt
但是要解决您的问题,现在打开 shell 调试/跟踪选项,或者通过更改脚本的顶行(shebang 行),例如
#!/bin/ksh -vx
或者通过使用匹配的对来跟踪这些行的状态,即
set -vx
while read line; do
print -u2 -- "#dbg: Line=${line}XX"
autosys_showJobHistory.sh $line \
| grep 1[1..6]:[0..9][0..9] \
| grep 24.12.2012 \
| tail -1
done < Test.txt
set +vx
我添加了一个额外的调试步骤,print -u2 -- ....(u2=stderror,--关闭打印选项处理)
现在,您可以通过查看该输出来确保没有多余的空格或制表符出现。
它们应该无关紧要,因为您没有引用您的 $line。作为测试的一部分,我建议像 "${line}" 一样引用它。
然后我会注释掉尾部和 grep 行。你想看看是什么步骤导致这个中断,对吧?那么 autosys_script 本身是否仍会产生您期望的中间输出?那么 autosys + 1 grep 是否按预期产生,+2 grep,+ tail?您应该能够轻松查看丢失输出的位置。
IHTH