Parsen der Ausgabe von "Uptime" mit Bash

3209
Keek

Ich möchte die Ausgabe des uptimeBefehls in einer CSV-Datei in einem Bash-Skript speichern. Da der uptimeBefehl über verschiedene Ausgabeformate verfügt, die auf der Zeit seit dem letzten Neustart basieren case, kam mir eine ziemlich schwere Lösung auf den Grund, aber es gibt sicherlich einen eleganteren Weg, dies zu tun.

Betriebszeitausgabe:

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

erwünschtes Ergebnis:

15:12,1 user,0.00 0.02 0.00, 

aktueller Code:

case "`uptime | wc -w | awk ''`" 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 ''`","`uptime | awk '{ print $4,$5 }' | awk ''`","`uptime | awk '{ print $8,$9,$10 }' | awk ''`"," ;;  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 ''`","`uptime | awk '{ print $6,$7 }' | awk ''`","`uptime | awk '{ print $10,$11,$12 }' | awk ''`"," ;;  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 ''`","`uptime | awk '{ print $7,$8 }' | awk ''`","`uptime | awk '{ print $11,$12,$13 }' | awk ''`"," ;; esac 
2

3 Antworten auf die Frage

7
Anton

Ich empfehle Ihnen, direkt zur Quelle zu gehen, anstatt die Ausgabe der Betriebszeit (1) zu analysieren.

  • Uptime ist in /proc/uptime
  • Lastdurchschnitt ist in /proc/loadavg
  • Die Anzahl der Benutzer ist etwas komplizierter, siehe Wikipedia: utmp, aber die Befehle w(1)oder who(1)helfen Ihnen.

Folgendes ist nicht genau die gewünschte Ausgabe, nach der Sie gefragt haben, aber Sie bekommen die Idee:

$ 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 

Das bedeutet 8,55e6 Sekunden (fast 99 Tage), 4 Benutzer, Lastdurchschnitt.

Entschuldigung, die Frage wurde falsch mit "linux" getaggt, ich bin auf einem FreeBSD-System (FreeNAS), aber ich verstehe, worauf es ankommt, und der Ansatz wäre ähnlich: Parsing `/ sbin / sysctl kern.boottime` und` / sbin / sysctl vm. loadavg` Danke für den Hinweis! Keek vor 10 Jahren 1
1
msnfreaky

Der folgende Code eignet sich für alle Arten von Betriebszeiten. Hoffe, das wird dir helfen,

uptime=`uptime` upt=`echo $uptime | grep -ohe 'up .*user*' | awk '' | sed 's/,//g' | sed -r 's/(\S+\s+)//' | 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 
0
Hannu

FWIW:

$ echo -e "\ n $ (Betriebszeit) \ n"; Betriebszeit \ | sed -nre / s + + ([\: 0-9] +), + ([^] [^,] +), +. *: + ([^] +), + ([^] +), + ([^] +) $ / \ 1, \ 2, \ 3 \ 4 \ 5 / p '  12:58:47 5:53, 2 Benutzer, Lastdurchschnitt: 0,21, 0,09, 0,10  5:53, 2 Benutzer, 0,21 0,09 0,10 

Beachten Sie, dass das Dezimaltrennzeichen für Zahlen von Ihren Ländereinstellungen abhängt.