題 用bash解析“正常運行時間”的輸出


我想保存輸出 uptime 命令進入Bash腳本中的csv文件。自從 uptime 命令具有不同的輸出格式,基於自上次重啟以來的時間我想出了一個非常重的解決方案 case,但肯定有更優雅的方式來做到這一點。

正常運行輸出:

 8:58AM  up 15:12, 1 user, load averages: 0.01, 0.02, 0.00

期望的結果:

15:12,1 user,0.00 0.02 0.00,

當前代碼:

case "`uptime | wc -w | awk '{print $1}'`" in
#Count the number of words in the uptime output

10)
    #e.g.:  8:16PM  up  2:30, 1 user, load averages: 0.09, 0.05, 0.02
    echo -n `uptime | awk '{ print $3 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $8,$9,$10 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

12)
    #e.g.: 1:41pm  up 105 days, 21:46,  2 users,  load average: 0.28, 0.28, 0.27
    echo -n `uptime | awk '{ print $3,$4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $6,$7 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $10,$11,$12 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

13)
    #e.g.: 12:55pm  up 105 days, 21 hrs,  2 users,  load average: 0.26, 0.26, 0.26
    echo -n `uptime | awk '{ print $3,$4,$5,$6 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $7,$8 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $11,$12,$13 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;
esac

2
2017-08-23 06:57


起源




答案:


我建議你直接轉到源代碼而不是解析uptime(1)輸出。

  • 正常運行時間 /proc/uptime
  • 平均負載是 /proc/loadavg
  • 有多少用戶參與其中,請參閱 維基百科:utmp文件,但是 w(1) 要么 who(1) 命令會幫助你。

以下並不是您要求的所需輸出,但您明白了這一點:

$ echo $(cut -d ' ' -f 1 </proc/uptime),$(w -h | wc -l),$(cut -d ' ' -f 1-3 </proc/loadavg),
8545883.49,4,0.00 0.01 0.05

這意味著8.55e6秒(差不多99天),4個用戶,平均負載。


7
2017-08-23 07:48



對不起,這個問題被錯誤地標記為“linux”,我在FreeBSD系統(FreeNAS)上,但是我明白你的觀點與方法類似:解析 /sbin/sysctl kern.boottime 和 /sbin/sysctl vm.loadavg 謝謝你的提示! - Keek


以下代碼適合所有類型的正常運行時間輸出。希望對你有幫助,

uptime=`uptime`
upt=`echo $uptime | grep -ohe 'up .*user*' | awk '{gsub ( "user*","" ); print $0 }' | sed 's/,//g' | sed -r 's/(\S+\s+){1}//' | awk '{$NF=""}1'`
usrs=`echo $uptime | grep -ohe '[0-9.*] user[s,]'| sed 's/,//g'`
ldt=`echo $uptime | grep -ohe 'load average[s:][: ].*' | sed 's/,//g' | awk '{ print $3" "$4" "$5"," }'`
echo $upt, $usrs, $ldt

1
2017-08-23 08:37





FWIW:

$ echo -e“\ n $(正常運行時間)\ n”;正常運行時間
| sed -nre的/.+ up +([\:0-9] +),+([^] [^,] +),+。*:+([^] +),+([^] +),+([^] +)$ / \ 1,\ 2,\ 3 \ 4 \ 5 / p'

 12:58:47 up 5:53,2位用戶,平均負載:0,21,0,09,0,10

5:53,2個用戶,0,21 0,09 0,10

請注意,數字的小數分隔符取決於您的區域設置。


0
2017-08-23 11:16