web-dev-qa-db-ja.com

「稼働時間」の出力を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
Keek

Uptime(1)出力を解析するのではなく、ソースに直接アクセスすることをお勧めします。

  • 稼働時間は_/proc/uptime_です
  • 負荷平均は_/proc/loadavg_にあります
  • ユーザー数はもう少し複雑です。 Wikipedia: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ユーザー、平均負荷です。

8
Anton

次のコードは、あらゆる種類の稼働時間出力に適しています。これがお役に立てば幸いです、

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
msnfreaky

FWIW:

 $ echo -e "\ n $(稼働時間)\ n";稼働時間\ 
 | sed -nre's /.+ up +([\:0-9] +)、+([^] [^、] +)、+。*:+([^] +)、+([^]] +)、+([^] +)$/\ 1、\ 2、\ 3\4\5/p '
 
 12:58:47アップ5:53、2ユーザー、負荷平均:0,21、0,09、0,10 
 
 5:53、2ユーザー、0,21 0,09 0,10 

数値の小数点記号は、ロケール設定によって異なることに注意してください。

0
Hannu