2017-03-03 113 views
0

我有一個csv,我將在每天更新。 CSV文件的格式如下:使用awk更新csv文件

Name,Priority,UsedBy,Uptime 
"server1","3","owner1",100 
"server2","3","owner2",200 
"server3","3","owner3",300 

我寫了一個bash腳本來更新每天的基礎上的第4列的值,它工作正常。但是我想用awk簡化代碼到單線程。運行時間值取決於第一列的服務器值。我的腳本將使用下面的正則表達式通過SSH來獲得每個服務器的正常運行時間值:

ssh $serverName uptime | sed 's/.*up \([^,]*\), .*/\1/' 

我還在想出來的過程中,將張貼在這裏,以加快解決問題的時間。任何想法或給予的幫助將不勝感激。

最新更新

我試過如下圖所示,但這些代碼無濟於事:

#!/bin/bash 

uptime() { 
    myUptime=$(ssh $1 uptime | sed 's/.*up \([^,]*\), .*/\1/') 
    echo $myUptime 
} 

export -f uptime 

awk 'BEGIN{FS=OFS=","}NR>1{value=system("bash -c '\''uptime "$1"'\''") ;$4=value}1' temp.csv 

,並輸出如下:

[[email protected] tmp]# ./tempScript.sh 
"Name","Priority","UsedBy","Uptime" 
100 days 
"server1","3","owner1",0 

200 days 
"server2","3","owner2",0 

300 days 
"server3","3","owner3",0 

CSV文件仍然具有相同舊數據根本沒有修改。

+0

你是說在'Name'中的'1','2','3'對應於'100','200'等在正常運行時間下嗎? – Inian

+0

在此示例中,server1的運行時間爲100天,server2爲200天,server3爲300天。明天server1將是101天,server2是201天,server3是301天。如果任何一臺服務器沿途重新啓動,則正常運行時間將爲0或1天。當cron每天運行時。 – abduls85

回答

0

system調用返回的命令的exit status,但你可以使用getline像這樣:

awk 'BEGIN{FS=OFS=","}NR>1{ 
"uptime" | getline tmp 
split(tmp, utarray, " ") 
print $1","$2","$3","utarray[3]}' temp.csv 

注意"uptime"是得到執行,從而導致變量tmp被設置成類似11:09:00 up 1 day, 22:21, 1 user, load average: 0.00, 0.00, 0.00命令。然後,awk內置函數splittmp的值轉換爲使用空格作爲分隔符的數組utarray。在最後一行輸出記錄被彙編。