2017-02-25 23 views
0

我有一個腳本,並試圖將我的變量的內容附加到.log文件。我在另一篇文章(How can I append a variable text to last line of file via command line?)上看到,您可以使用echo「$(cat $ FILE)$ APPEND」> $ FILE執行此操作。我試過這樣做,它能夠無誤地運行腳本,並通過終端提供我需要的答案,但它不會將其附加到我的日誌文件中。任何人都可以請給我任何指針?從變量追加內容到日誌文件

#!/bin/bash 
mdate=echo date 
mcpu=echo $[100-$(vmstat 1 2 |tail -1|awk ‘{print $15}’)]% 
mmem=free | grep Mem | awk ‘{print $3/$2 * 100.0}’ 
sudo cat /dev/null > /home/daniel/systemstatus.log 
echo 「$(cat $systemstatus.log)$mdate」 >> $systemstatus.log 
echo 「$(cat $systemstatus.log)$mcpu」 >> $systemstatus.log 
echo 「$(cat $systemstatus.log)$mmem」 >> $systemstatus.log 

回答

1

下面應該工作:

#!/bin/bash 
mdate=$(echo date) 
mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print $15}')]%) 
mmem=$(free | grep Mem | awk '{print $3/$2 * 100.0}') 
>/home/daniel/systemstatus.log 
echo 「$(cat $systemstatus.log)$mdate」 >> systemstatus.log 
echo 「$(cat $systemstatus.log)$mcpu」 >> systemstatus.log 
echo 「$(cat $systemstatus.log)$mmem」 >> systemstatus.log 

需要注意的是,如果你想命令的輸出存儲在bash,那麼你應該在$()或``但是,使用圓命令現在不推薦使用重音符號。

此外,使用貓的/ dev/null>空在Linux下將具有基本相同的結果文件作爲簡單地使用>

至於您所遇到的問題,注意附加$之前的任何單詞基本上使腳本/命令尋找具有這種名稱的變量而不是文件名。

問候

+0

非常感謝你! –

1

嘗試之前systemstatus

刪除$當你鍵入$systemstatus,這意味着一個名爲 「systemstatus」 變量,而不是systemstatus文件。

+1

我假設OP創建在當前目錄中的文件'.log' –

+1

太感謝你了! –

3

你的代碼需要一些修改,以命令的輸出,你需要使用命令替換您不能分配變量,你試過的方式(var=$(command)):

mdate=$(date) 
mcpu=$((100 - $(vmstat 1 2 | tail -1| awk '{print $15}'))) 
mmem=$(free | grep Mem | awk '{print $3/$2 * 100.0}') 

您的文章包含無效報價爲殼。使用單引號'或雙引號"(每個都有其用途)。

但記錄的部分是比你想象的

logfile=/home/daniel/systemstatus.log 
echo "$mdate" >"$logfile" # Overwrites the previous log file 
echo "$mcpu" >>"$logfile" # Appends to the log file 
echo "$mmem" >>"$logfile" # Appends to the log file 

如果採集你的命令的輸出變量的唯一原因是用於記錄您可以通過重定向到您的日誌文件,進一步簡化而不捕獲輸出更簡單。

date >"$logfile" # Overwrites the previous log file 
echo $((100 - $(vmstat 1 2 | tail -1| awk '{print $15}'))) >>"$logfile" 
free | grep Mem | awk '{print $3/$2 * 100.0}' >>"$logfile" 

你甚至可以把重定向第一,取決於你的口味這可能是更清潔的眼球:

>"$logfile" date # Overwrites the previous log file 
>>"$logfile" echo $((100 - $(vmstat 1 2 | tail -1| awk '{print $15}'))) 
>>"$logfile" free | grep Mem | awk '{print $3/$2 * 100.0}' 

這個回答假設你的命令實際工作(我沒有測試過)。

+0

非常感謝幫助哥們,這樣做,解釋也很棒! –