2017-03-03 87 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。在最后一行输出记录被汇编。