我有一个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文件与旧数据相同,完全没有修改。
答案 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内置函数split
将tmp
的值转换为数组utarray
。在最后一行中汇编输出记录。