bashコマンドの出力からいくつかの情報を抽出しようとしています:
uptime | awk '{print $3}'
それを実行すると、次の結果が得られます。8:27,
最後の記号(つまり、コンマ)を削除するにはどうすればよいですか?
別のバリアント(awk
およびsed
を置き換えるcut
):
# "unnecessary" echo with evil backticks to get rid of extra spaces
echo `uptime|cut -d, -f1'
動作しているように見えます...稼働時間が1日に達するまで(指摘してくれた@sudo_Oに感謝します)。次に、出力形式に日数が含まれ、必要になります
echo `uptime|cut -d, -f2`
(24時間以上の稼働時間でテストしたため、後者が私の最初の答えでした)。
UPD:どちらのソリューションも実際には機能しません。後者は日数のない稼働時間を出力します。前者は日数がない場合に前にカンマ区切り文字がないため、時間を抽出できません。ただし、残りの答えは実際にはそれらによって証明されます。失敗。
全体のアプローチはエラーが発生しやすいです。数ヶ月と数年後に何が起こりますか?(私はそれがまだN日を示していることを思い出しているようですが、私は誤りを犯すことができます)。稼働時間がローカライズされた場合はどうなりますか?(既存のスクリプトのためにそれを拒否しましたか?)1ユーザー、「1ユーザー」、または「1ユーザー」に対して何が表示されますか?私たちがすべての答えを知っているなら、私たちはそれらに依存したいですか?
目的がユーザーに稼働時間を表示することである場合、正規表現を使用して「up」と「users」の間の部分を抽出すると、次のようになります。
uptime | sed 's/^.*up\(.*\), *[0-9]\+ *users.*$/\1/'
時間の比較や統計の収集を行う場合は、Linux固有のようなものの/proc/uptime
方が適しています(の最初の列/proc/uptime
は生の稼働時間秒です)。
あなたはほとんどそれを持っていました、ただsubstr
またはgsub
で機能しますawk
$ uptime | awk '{print substr($3,1,length($3)-1)}'
2:49
$ uptime | awk '{sub(/,/,"");print $3}'
2:49
余分な配管やバックティックの誤った使用は必要ありません。
(GNU)uptime
を使用して出力が異なる場合、より優れた、さらに堅牢なソリューション: grep -Po "\d{1,2}:\d{2}(?=,)"
# More than one day
$ uptime
12:46:18 up 92 days, 5:00, 2 users, load average: 0.00, 0.01, 0.05
$ uptime | grep -Po "\d{1,2}:\d{2}(?=,)"
5:00
# Less than one day
$ uptime
12:47:30 up 4:24, 7 users, load average: 0.34, 0.12, 0.07
$ uptime | grep -Po "\d{1,2}:\d{2}(?=,)"
4:24
またはsed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p
:
# More than one day
$ uptime
12:54:00 up 92 days, 5:07, 2 users, load average: 0.03, 0.02, 0.05
$ uptime | sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p'
5:07
# Less than one day
$ uptime
12:54:55 up 4:31, 7 users, load average: 0.07, 0.10, 0.08
$ uptime | sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p'
4:31
更新:それでuptime
、1時間未満の場合、出力が再び異なる場合は!?
$ uptime
14:46:03 up 3 min, 4 users, load average: 0.54, 0.75, 0.36
$ uptime
14:53:40 up 11 min, 4 users, load average: 0.48, 0.62, 0.46
regexp
それらすべてを支配するもの:
$ sed -rn 's/.*up\s+(.*),\s+[0-9]+ users.*/\1/p' file
92 days, 5:00
4:24
11 min
3 min
私はこれが何年も処理すると思います!
uptime | awk '{print $3}' | tr -d ,
@sudo_Oのサンプル稼働時間出力を考えると(ありがとう!):
$ cat file
12:46:18 up 92 days, 5:00, 2 users, load average: 0.00, 0.01, 0.05
12:47:30 up 4:24, 7 users, load average: 0.34, 0.12, 0.07
$ awk -F'[ ,]+' '{print $3 (/days/?" "$4" "$5:"")}' file
92 days 5:00
4:24
$ sed 's/.*up *\(.*\), *[0-9]* users.*/\1/' file
92 days, 5:00
4:24
使用sed
:
uptime | awk '{print $3}' | sed '$ s/,$//'