GNU/Linux >> Linux の 問題 >  >> Linux

日、時間、分を表示する Bash 形式の稼働時間

uptime -p をサポートするシステム用のユニバーサル シェル スクリプトを作成しました。 新しい Linux のように、Mac OS X のようにそうでないもののために。

#!/bin/sh

uptime -p >/dev/null 2>&1

if [ "$?" -eq 0 ]; then
  # Supports most Linux distro
  # when the machine is up for less than '0' minutes then
  # 'uptime -p' returns ONLY 'up', so we need to set a default value
  UP_SET_OR_EMPTY=$(uptime -p | awk -F 'up ' '{print $2}')
  UP=${UP_SET_OR_EMPTY:-'less than a minute'}
else
  # Supports Mac OS X, Debian 7, etc
  UP=$(uptime | sed -E 's/^[^,]*up *//; s/mins/minutes/; s/hrs?/hours/;
  s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/;
  s/^1 hours/1 hour/; s/ 1 hours/ 1 hour/;
  s/min,/minutes,/; s/ 0 minutes,/ less than a minute,/; s/ 1 minutes/ 1 minute/;
  s/  / /; s/, *[[:digit:]]* users?.*//')
fi

echo "up $UP"

要旨

独自のカスタマイズで John1024 の回答を参照しました。


私の uptime 次のような出力が生成されます:

$ uptime
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

それを自分のフォーマットに変換するには:

$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.

仕組み

  • -F'( |,|:)+'

    awk は入力をフィールドに分割します。これは awk に、1 つまたは複数のスペース、コンマ、またはコロンの任意の組み合わせをフィールド セパレータとして使用するように指示します。

  • print $6,$7",",$8,"hours,",$9,"minutes."

    これは awk に 6 番目のフィールドと 7 番目のフィールド (スペースで区切られている) を出力し、その後にコンマ、8 番目のフィールド、文字列 hours, を出力するように指示します。 9 番目のフィールド、そして最後に文字列 minutes. .

sed を使用して稼働時間が短いコンピュータを処理する

再起動から、私の uptime 次のような出力が生成されます:

 03:14:20 up 1 min,  2 users,  load average: 2.28, 1.29, 0.50
 04:12:29 up 59 min,  5 users,  load average: 0.06, 0.08, 0.48
 05:14:09 up  2:01,  5 users,  load average: 0.13, 0.10, 0.45
 03:13:19 up 1 day, 0 min,  8 users,  load average: 0.01, 0.04, 0.05
 04:13:19 up 1 day,  1:00,  8 users,  load average: 0.02, 0.05, 0.21
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

次の sed コマンドは次の形式を処理します:

uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/' 

上記の時間で、これは以下を生成します:

1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day,  1 hours, 0 minutes
25 days, 21 hours, 30 minutes

仕組み

  • -E 拡張正規表現構文をオンにします。 (古い GNU sed では、-r を使用します -E の代わりに )

  • s/^[^,]*up *//

    この代替コマンドは、up までのすべてのテキストを削除します .

  • s/, *[[:digit:]]* users.*//

    この代替コマンドは、ユーザー数とそれに続くすべてのテキストを削除します。

  • s/min/minutes/

    これは min を置き換えます minutes で .

  • s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'

    行に hh:mm 形式の時刻が含まれている場合、これにより時と分が分離され、hh hours, mm minutes に置き換えられます。 .

awk を使用して稼働時間が短いコンピュータを処理する

uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'

上記と同じテスト ケースでは、以下が生成されます。

0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.

複数行にまたがる awk コードを好む人向け:

uptime | awk -F'( |,|:)+' '{
    d=h=m=0;
    if ($7=="min")
        m=$6;
    else {
        if ($7~/^day/) { d=$6; h=$8; m=$9}
        else {h=$6;m=$7}
        }
    }
    {
        print d+0,"days,",h+0,"hours,",m+0,"minutes."
    }'

解決策 :Linux の稼働時間を秒単位で取得するには、bash に移動して cat /proc/uptime と入力します .最初の数値を解析し、必要に応じて変換します。

RedHat のドキュメントから:

<ブロック引用>

このファイルには、前回の再起動以降のシステムの稼働時間に関する詳細情報が含まれています . /proc/uptime の出力 非常に最小限です:

350735.47 234388.90

最初 number は、システムが稼働していた合計秒数です。

2番目 number は、マシンがアイドルに費やした時間 (秒単位) です。


完全性のためだけに...どうしたものか:

$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes

Linux
  1. UbuntuLinuxで稼働時間コマンドを使用する方法

  2. Bash +特別な形式で印刷するためにPrintfを使用しますか?

  3. サブディレクトリを含む x 日より古いファイルを削除する Bash スクリプト

  1. HH:MM:SS (時:分:秒.分割秒) を秒に変換する簡単な方法

  2. Bashでドット区切りバージョン形式の2つの文字列を比較するには?

  3. bashで日付から日数を引く

  1. 特定の時間の間、15分ごとに実行されるcrontab

  2. jenkins パイプラインで bash コマンドを実行する

  3. bashプロンプトに現在のディレクトリ名のみを表示します(フルパスではありません)