用awk更新csv文件

时间:2017-03-03 07:27:11

标签: bash csv unix

我有一个csv,我会每天更新。 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

以及以下输出:

[root@masterserver 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文件与旧数据相同,完全没有修改。

1 个答案:

答案 0 :(得分: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。在最后一行中汇编输出记录。