2012-12-26 106 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