写了下面的所有内容,然后注意到您的 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) 给您带来了问题。使用 .清理基于 PC 的文件(或任何通过 ftp 发送的文件)dos2unix file [file2 ...]
。
如果上述方法没有帮助,您将不得不“分而治之”来调试您的问题。
当我进行以下测试时,我得到了预期的输出
$ 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, -- closes option processing for print) 现在您可以通过查看该输出来确保没有额外的空格或制表符出现。
它们不应该重要,因为您没有引用您的内容$line
。作为测试的一部分,我建议像"${line}"
.
然后我会注释掉尾部和 grep 行。你想看看是什么步骤导致这个中断,对吧?那么 autosys_script 本身是否仍会产生您期望的中间输出?那么 autosys + 1 grep 是否按预期产生,+2 grep,+ tail?您应该能够轻松地看到丢失输出的位置。
IHTH