写下所有,然后注意到你的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
但解决您的问题,现在打开外壳调试/跟踪选项,通过更改脚本(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 greps,+ tail?您应该能够轻松看到丢失输出的位置。
IHTH