4

bashコマンドの出力からいくつかの情報を抽出しようとしています:

uptime | awk '{print $3}'

それを実行すると、次の結果が得られます。8:27,

最後の記号(つまり、コンマ)を削除するにはどうすればよいですか?

4

5 に答える 5

9

別のバリアント(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は生の稼働時間秒です)。

于 2013-01-11T11:00:40.323 に答える
7

あなたはほとんどそれを持っていました、ただ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

私はこれが何年も処理すると思います!

于 2013-01-11T11:08:17.783 に答える
4

uptime | awk '{print $3}' | tr -d ,

于 2013-01-11T11:00:12.583 に答える
2

@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
于 2013-01-11T13:08:33.677 に答える
1

使用sed

uptime | awk '{print $3}' | sed '$ s/,$//'
于 2013-01-11T10:58:35.873 に答える