2011-04-26 21 views
0

所以我有這個假脫機文件有這種內容。

SQL> select file_name from dev_files; 

FILE_NAME 
------------------------------------------------------------------ 
file1.txt 
file2.doc 
file3.pdf 
total.xls 

4 rows selected. 

SQL> spool off 

我正在寫一個ksh腳本來將這些文件加載​​到ftp服務器並更新一個日誌文件。並且我在大時間裏堅持着。這是我多次嘗試後糟糕代碼的一部分。

dump="spoolfile.txt" 

while read line; 
do 

if [[`expr match "$line" 'SQL'` !=3]] && [[`expr match "$line" 'FILE_NAME'` !=9]] && [[`expr match "$line" '---------'` !=9]] 
then 
    ftp -inv $tgt_server <<EOT 
    quote user $uname 
    quote password $pword 
    mput $src_path/$line 
    quit 
    EOT 

    echo "sent $line" >> sent_files.log 
fi 
done < $dump 

我如何確保「沒有行選擇」,並說「4行選擇」。不讀?可以有任何數字而不是4對應於文件的數量。在沒有文件的情況下,假脫機文件看起來像這樣。 '。'也失蹤了。

SQL> select file_name from dev_files; 

no rows selected 

SQL> spool off 
+0

你有沒有在SQL * Plus腳本生成spoolfile.txt控制?如果是這樣,你可以事先過濾這些線。 – tawman 2011-04-26 18:46:27

+0

我想到了那個。但似乎輸出是另一個日誌文件需要的。 – Sriram 2011-04-26 18:50:46

+0

那麼,這將是最簡單的,你可以在之後添加所需的日誌記錄:設置標題關閉 設置反饋關閉 設置頁面大小0 設置回顯關閉 – tawman 2011-04-26 18:54:17

回答

0

我同意大多數關於「關閉標題」等,在sqlplus中的意見,

但這是易peasy ;-)

while read line; 
do 
    case ${line} in 
    -------*) continue ;; 
    FILE_NAME) continue ;; 
    SQL[>]) continue ;; 
    *rows\ selected) continue ;; 
    esac 

    # with enough case match targets, you can probably eliminate 
    # the if/fi completely. Good luck. 
    if [[`expr match "$line" 'SQL'` !=3]] ..... 
    ftp ... 
    fi 
done < $dump 

你不得不嘗試以及在案例陳述中完整清理的價值。

另外請注意,對於任何不尋常的字符,如「>」,它可能是更好地把它們作爲一個字符類[>](再次要求你做一些實驗)

最後,請注意,如果你想。包括的情況下比賽的目標空格字符,無論是環繞在DBL引號(「)的短語或逃避每個WS字符像‘\’

+0

hhaha ..首先我不是一個shell大師,實際上期待某種正則表達式的答案加上它已經有一段時間我已經登錄到stackoverflow ..;)也搜索'選定'不會幫助,因爲它可以是一個文件名 – Sriram 2011-04-26 19:33:54

+0

如果你希望得到一個正則表達式的答案,你應該在你的問題中或通過你的標籤表明。但是,沒有必要得到防禦,只需對投票中的一些答案進行投票即可。 ***在任何情況下,***,Case設計使用正則表達式作爲匹配目標。僅僅因爲我沒有在這個例子中使用正則表達式的全部功能並不意味着他們不能。當明確每個案例時,理解代碼更容易。我會稍微擴展一下我的答案以表示誠意,並向您展示案例陳述可以使用reg exp。 – shellter 2011-04-26 19:44:17

0

這裏是一個更簡單的soltion:不是試圖找到行無視,標記線的過程:

select concat("JHFDGFSH ",file_name) from dev_files 

現在您只需忽略任何不以JHFDGFSH開頭的行。

[編輯]如果你不能這樣做:開始閱讀,當你只有一條線,只有並停在第一個空行。這應該工作,除非Oracle開始頁面。

和開放的問題,上游來告訴他們,他們的接口是易碎的,它將打破最終會。

如果沒關係,當它打破和產量數據下調了兩天的不是你的問題,而不是你的錯;只是展示問題並說「看?你想這樣。」

KSH也可能是不正確的工具;看看awk。這應該工作:

/^---+/,/^[ \t]*$/ { print; } 

如果你不能用awk,怎麼樣處理每一行作爲文件名,而忽略那些不存在嗎?

只要沒有人創建一個名爲FILE_NAME4 rows selected.SQL> spool off的文件,只要您確保正確引用所有字符串,就應該找到該文件。

+0

這是一個很好的工作,但我想我沒有訪問權限來改變查詢是如何工作的,因爲我是在生成假脫機文件後進入圖片界面的一部分 – Sriram 2011-04-26 19:54:40

+0

+1年(最後一行:)。希望他們改變標題和回聲 – Sriram 2011-04-26 20:12:57