2012-12-26 110 views
2

我们使用一些名为Autosys的包,并且这个包中有一些特定的命令。我有一个变量列表,我喜欢将其中一个Autosys命令作为变量逐个传入。在ksh中逐行读取文件

例如一个这样的变量VAR1,使用这种VAR1我想启动命令是这样的

autosys_showJobHistory.sh var1 

现在,当我启动下面的书面命令,它给了我所需的输出。

echo "var1" | while read line; do autosys_showJobHistory.sh $line | grep 1[1..6]:[0..9][0..9] | grep 24.12.2012 | tail -1 ; done 

但是,如果我把var1放在一个文件中说Test.txt并使用cat启动相同的命令,它什么也不给我。我的印象是autosys_showJobHistory.sh命令在这种情况下不起作用。

cat Test.txt | while read line; do autosys_showJobHistory.sh $line | grep 1[1..6]:[0..9][0..9] | grep 24.12.2012 | tail -1 ; done 

我在做什么错误的第二个命令?

回答

4

写下所有,然后注意到你的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