2009-11-09 57 views
0

我目前有一個請求來構建一個shell腳本以使用SQL(Oracle)從表中獲取一些數據。我正在運行的查詢返回一些行。有沒有辦法使用像結果集這樣的東西?需要幫助通過shell腳本執行SQL並使用結果集

目前,我正在將它重定向到一個文件,但我無法再次重複使用這些數據進行進一步處理。


編輯:感謝您的答覆基因。結果文件如下所示:

UNIX_PID 37165 
---------- 
PARTNER_ID prad 
-------------------------------------------------------------------------------- 
XML_FILE 
-------------------------------------------------------------------------------- 
/mnt/publish/gbl/backup/pradeep1/27241-20090722/kumarelec2.xml 


pradeep1 
/mnt/soar_publish/gbl/backup/pradeep1/11089-20090723/dataonly.xml 


UNIX_PID 27654 
---------- 
PARTNER_ID swam 
-------------------------------------------------------------------------------- 
XML_FILE 
-------------------------------------------------------------------------------- 
smariswam2 
/mnt/publish/gbl/backup/smariswam2/10235-20090929/swam2.xml 

有多行像這樣。我的要求是隻使用shell腳本並編寫該程序。

我需要採取每個PID和檢查過程是否正在運行,我可以照顧。

我的問題是如何檢查每個PID,以便我可以循環並獲得相應的partner_idxml_file名稱?由於它是一個文件,我怎樣才能得到確切的相應值?

+0

你實際上是否限於使用shell腳本語言,如果是的話,是什麼shell? – 2009-11-09 06:13:35

回答

0

這是一個建議的方法。這是不是從您發佈的樣品清楚,所以我假定這其實是你的樣本文件的樣子:

UNIX_PID 37165 PARTNER_ID prad XML_FILE /mnt/publish/gbl/backup/pradeep1/27241-20090722/kumarelec2.xml pradeep1 /mnt/soar_publish/gbl/backup/pradeep1/11089-20090723/dataonly.xml 
UNIX_PID 27654 PARTNER_ID swam XML_FILE smariswam2 /mnt/publish/gbl/backup/smariswam2/10235-20090929/swam2.xml 

我也假設:

  1. 有一個線 - 在文件的最後一行輸入 的末尾。
  2. 這些列由一個單獨的 空格分開。

這裏有一個建議bash腳本(不是最優的,我敢肯定,但功能):

#! /bin/bash 
cat myOutputData.txt | 
while read line; 
do 
    myPID=`echo $line | awk '{print $2}'` 
    isRunning=`ps -p $myPID | grep $myPID` 
    if [ -n "$isRunning" ] 
    then 
     echo "PARTNER_ID `echo $line | awk '{print $4}'`" 
     echo "XML_FILE `echo $line | awk '{print $6}'`" 
    fi 
done 

通過輸入文件的每一行(行)的腳本迭代。它使用awk提取第2列(PID),然後執行檢查(使用ps -p)以查看進程是否正在運行。如果是,它再次使用awk從文件中提取並回顯兩個字段(PARTNER ID和XML FILE)。您應該能夠進一步調整腳本以適應您的需求。如果您想使用不同的列分隔符或進行其他文本處理,請在awk上進行閱讀。

如果輸出文件每個數據元素包含一行(如您所示),情況會變得更加棘手。一個好的方法是在腳本中使用簡單的狀態機制,並「記住」最近看到的PID是否正在運行。如果是,則在下一個PID之前出現的任何數據元素都應該打印出來。這裏有一個註釋腳本,用你提供的格式文件來做這件事。請注意,您必須在最後一行輸入數據的末尾有換行符,否則最後一行將被刪除。

#! /bin/bash 
cat myOutputData.txt | 
while read line; 
do 
    # Extract the first (myKey) and second (myValue) words from the input line 
    myKey=`echo $line | awk '{print $1}'` 
    myValue=`echo $line | awk '{print $2}'` 

    # Take action based on the type of line this is 
    case "$myKey" in 
     "UNIX_PID") 
      # Determine whether the specified PID is running 
      isRunning=`ps -p $myValue | grep $myValue` 
     ;; 
     "PARTNER_ID") 
      # Print the specified partner ID if the PID is running 
      if [ -n "$isRunning" ] 
      then 
       echo "PARTNER_ID $myValue" 
      fi 
     ;; 
     *) 
      # Check to see if this line represents a file name, and print it 
      # if the PID is running 
      inputLineLength=${#line} 
      if (($inputLineLength > 0)) && [ "$line" != "XML_FILE" ] && [ -n "$isRunning" ] 
      then 
       isHyphens=`expr "$line" : -` 
       if [ "$isHyphens" -ne "1" ] 
       then 
        echo "XML_FILE $line" 
       fi 
      fi 
     ;; 
    esac 
done 

我認爲我們現在已經進入了定製軟件開發的領域,所以我會放棄它。您應該有足夠的空間來根據自己的喜好自定義腳本。祝你好運!

+0

這看起來不錯..但結果文件沒有單行中的所有值... 有沒有在shell腳本中的方式,我可以在一個變量中獲得查詢的結果並像結果集一樣使用它。 – user57421 2009-11-09 07:35:56

1

你的問題在具體細節上很短(你重定向你的查詢輸出的文件樣本會有幫助,以及你對數據實際要做什麼的一些想法),但作爲一個一般的做法是,一旦將查詢結果存入文件中,爲什麼不使用選擇的腳本語言的強大功能(ruby和perl都是不錯的選擇)來解析文件並對每行進行操作?