Разбор вывода "uptime" с помощью bash

3113
Keek

Я хотел бы сохранить выходные данные uptimeкоманды в CSV-файл в сценарии Bash. Поскольку 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 ''`" 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 ответа на вопрос

7
Anton

I suggest you go directly to the source instead of parsing uptime(1) output.

  • Uptime is in /proc/uptime
  • Load average is in /proc/loadavg
  • Number of users is a bit more involved, see Wikipedia:utmp, but the w(1) or who(1) commands will help you.

The following is not exactly the desired output you asked for, but you get the idea:

$ 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 

That means 8.55e6 seconds (almost 99 days), 4 users, load average.

Извините, вопрос был неправильно помечен как "linux", я нахожусь в системе FreeBSD (FreeNAS), но я понимаю вашу точку зрения, и подход будет аналогичным: парсинг `/ sbin / sysctl kern.boottime` и` / sbin / sysctl vm. loadavg` Спасибо за подсказку! Keek 9 лет назад 1
1
msnfreaky

The following code will suits all kind of uptime outputs. Hope this will help you,

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 $ (uptime) \ 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 

Обратите внимание, что десятичный разделитель для чисел зависит от настроек вашего языка.