2010-09-06 70 views
0

非常簡單的問題,我試圖在執行命令並重新使用它之後得到一些輸出。Bash腳本 - 獲取系統輸出並將其用作變量

#!/bin/bash 
echo what's the source db name? 
read SOURCE 
echo what's the target db name? 
read TARGET 
db2 backup db $SOURCE online compress include logs 
READ SOME OF THIS LINE = SOURCE 
db2 restore database $SOURCE taken at $DB2TIME into $TARGET 

行「讀一些這條線的」像這樣輸出: 備份成功。該備份映像的時間戳爲:20100906142221 我覺得grep命令將做到這一點,但我不是100%肯定

+0

您已經發布了兩個followups爲*答案*。他們應該作爲編輯發佈到您的原始問題。如果您希望特定用戶看到您的後續行動,則應通過將其附加到他們留下的答案或在評論中使用@username來解決對他們的評論。你可以說類似'@dennis:請參閱我編輯的問題以獲取更多信息。請記住,在這些網站上,答案旨在成爲問題的答案,而不是其他答案或評論的答案。 – 2010-09-06 06:57:45

+0

@dennis thanks dennis,問題是當我回答一個答案時,我放棄了所有的編輯選項,所以如果我想把代碼和突出顯示格式看起來很糟糕 - 有沒有一種方法可以在回覆評論中進行格式化? – edumike 2010-09-06 07:25:16

+0

無論如何只是發表評論。如果你沒有足夠的代表來自己編輯你的問題,你會得到一些有幫助的人將你的問題納入其中。 – paxdiablo 2010-09-06 08:20:06

回答

0

bash,您捕獲一個命令的輸出與$()(或反引號,但我更喜歡前者因爲你可以嵌套它們):

pax> xx=$(ls -1 | grep bac) 

pax> echo "..${xx}.." 
..backup0.sh 
backup1.sh.. 

所以,在您的特定情況下,你會看這樣的:

timestamp=$(db2 backup db $SOURCE online compress include logs 2>&1 
    | tee /tmp/output 
    | grep 'image is' 
    | awk '{print $11}') 

請記住我已經分裂跨多個線可讀性,但它應該去在一條線上。至於它是如何工作的:

  • 2>&1結合了標準輸出和錯誤。
  • tee將確保您將整個輸出存儲在某處。
  • grep會給你相關的行。
  • awk只會打印出20100906142221
  • xx=$(...)將採取並將其分配到xx

如果你的輸出與你所說的略有不同,你可能需要微調一些命令,但這應該是一個好的開始。


基於評論,這裏就是你需要先從:

#!/bin/bash 
echo what's the source db name? 
read SOURCE 
echo what's the target db name? 
read TARGET 
db2 backup db $SOURCE online compress include logs 2>&1 | tee /tmp/db_bkp_$$ 
DB2TIME=$(cat /tmp/db_bkp_$$ | grep 'image is' | awk '{print $11}') 
rm -rf /tmp/db_bkp_$$ 
db2 restore database $SOURCE taken at $DB2TIME into $TARGET 

這將執行DB2命令發送輸出和錯誤,以這兩個終端臨時文件($$給你當前進程ID以避免文件名衝突)。然後從臨時文件中提取日期/時間,然後刪除該文件。

然後你使用日期/時間。

+0

而不是'$ 11'爲什麼不使用'-F:'?你也可以讓'awk'做你所擁有的'grep'。 'tee ... | awk -F:'/ image is/{print $ 2}'' – 2010-09-06 07:00:43

+0

對不起,我是一個noob,請看我上面的回覆 - 這似乎是以某種方式執行該命令兩次。 @dennis我必須嘗試這種方式,看看我是否只在一次執行中獲得所需結果 – edumike 2010-09-06 07:27:26

+0

沒有問題,@edumike。這是因爲你實際上正在執行該行兩次。你應該只在'timestamp = ...'行內完成。這將執行命令,將完整輸出傳送到/ tmp/output並正確設置變量。如果你想要完整的輸出,只需'cat/tmp/output'。 – paxdiablo 2010-09-06 07:49:20

0

與@ PAX的回答繼續,你的代碼現在變爲:

#!/bin/bash 
echo what's the source db name? 
read SOURCE 
echo what's the target db name? 
read TARGET 
DB2TIME=$(db2 backup db $SOURCE online compress include logs) 
# you have read it above <--- READ SOME OF THIS LINE = SOURCE 
db2 restore database $SOURCE taken at $DB2TIME into $TARGET 
0

@pax @dennis @pavanlimo對不起,我做的時候我在寫這一個錯字,

我需要能夠讀取$ DB2TIME後我執行:

db2 backup db $SOURCE online compress include logs 

我得到的輸出:

The timestamp for this backup image is : 20100906142221 

我需要把20100906142221到$ DB2TIME這樣我就可以執行下一個命令

db2 restore database $SOURCE taken at $DB2TIME into $TARGET 
相關問題