透過shell指令碼格式化tnsnames.ora內容案例一則

winston_DBA發表於2015-08-11

最近總結了下工作過程中的工作量,發現為開發人員配置引數佔據了較大的一塊,於是便想透過shell指令碼簡化工作流程操作及減少工作量。
在配置引數的過程中,首先需要檢視tnsnames.ora中的內容,如果需要配置的tns串已經在檔案中存在,則直接將相關引數指向某個tns串即可。如果不存在,則涉及在tnsnames.ora中新增tns串,再設定相關引數。
在現在的工作中,我們確定透過cat檢視tnsnames.ora,接著結合管道和grep來確認tns串是否存在,但這樣通常過於繁瑣,我們想簡單寫個shell指令碼,以後只需要將tnsnames.ora作為引數傳入,即可輸出相關結果及提示相應的操作。
在編寫指令碼過程中,首先面臨的一個問題就是tnsnames.ora中tns串的格式不一致:有的tns在同一行,有的tns串分好幾行,這樣的話,我們需要對檔案格式進行格式化。為了便於後續的操作,我們決定將所有的tns串都整理成一行。
格式化指令碼主要內容如下:
sed '/^$/d' $1 | sed 's/ //g' | sed ':a;N;$!ba;s/\=\n/\=/g' | sed ':a;N;$!ba;s/\n(/(/g' | sed ':a;N;$!ba;s/\n)/)/g' > tnsnames.result
指令碼的主要思路為:
1.首先將tnsnames.ora裡的空行和空格去除。
2.將以  (  和  )  開頭的行,整理到一行
3.將處理後的結果重定向到一個檔案中,儲存下來。

對於sed ':a;N;!ba;s/\n(/(/g'  命令的解釋:
:a建立一個標記。
N 追加當前行和下一行到模式空間中
ba如果處於最後一行前,跳轉到之前的標記處
$!ba($!意思是不在最後一行做後面的操作,最後一行,特殊處理。)

查詢到tns串是否存在後的操作,由於較簡單,略過。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30167136/viewspace-1767815/,如需轉載,請註明出處,否則將追究法律責任。

相關文章