2

Я хотел бы сохранить вывод команды 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 '{print $1}'`" 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 '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $8,$9,$10 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

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 '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $6,$7 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $10,$11,$12 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

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 '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $7,$8 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $11,$12,$13 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;
esac

3 ответа3

8

Я предлагаю вам перейти непосредственно к источнику вместо анализа вывода uptime(1).

  • Время работы в /proc/uptime
  • Средняя загрузка находится в /proc/loadavg
  • Количество пользователей немного больше, см. Википедию:utmp, но вам помогут команды w(1) или who(1) .

Следующее не совсем то, что вы просили, но вы поняли:

$ 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

Это означает 8,55e6 секунд (почти 99 дней), 4 пользователя, средняя загрузка.

1

Следующий код подойдет для всех видов выходных данных. Надеюсь, что это поможет вам,

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

FWIW:

$ echo -e "\n$(uptime)\n" ; uptime \
| sed -nre 's/.+up +([\:0-9]+), +([^ ] [^,]+), +.*: +([^ ]+), +([^ ]+), +([^ ]+)$/\1, \2, \3 \4 \5/p'

 12:58:47 up  5:53,  2 users,  load average: 0,21, 0,09, 0,10

5:53, 2 users, 0,21 0,09 0,10

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .