LINUX.ORG.RU

Помогите с sh-скриптом


0

0

$ cat /proc/acpi/battery/C1AC/state

present:                 yes
capacity state:          ok
charging state:          charging
present rate:            273 mA
remaining capacity:      1940 mAh
present voltage:         16776 mV

Это состояние батареи.

Нужно выпарсить remaining capacity, т.е. число '1940' в данном случае, и вернуть 0 если оно больше var_low_capacity или 1, если меньше/равно.

В с-подобном псевдокоде:

int battery_state()
{
   int low_capacity = 100;
   int remaining_capacity = smart_magic_parser(/proc/acpi/battery/C1AC/state);
   return (remaining_capacity <= low_capacity) ? 0 : 1;
}

Нужен аналогичный скрипт на баше/сед/авк'e
Буду очень признателен!

cat /proc/acpi/battery/C1AC/state | awk -vlim=100 '/^remaining.*capacity/ { print ($3 > lim) }'

dilmah ★★★★★
()

Лехко же:

cat /proc/acpi/battery/C1AC/state | grep 'remaining capacity' | awk '{print $3}'

anonymous
()

Ой, не прочитал внимательно.

А вот у dilmah на первый взгляд очень элегантное решение :)

anonymous
()

отправная точка - http://tldp.org/LDP/abs/html/ и:

rem=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk '{print $3}'`

if [ $rem -gt 10000 ];then
 echo true
else
 echo false
fi

Pi ★★★★★
()
Ответ на: комментарий от anonymous

А как сделать чтоб это был исполняемый sh файл, возвращающий 0/1 как успешность своего выполнения, чтоб на if bat.sh; then action.sh; fi сработало?

fifajan
() автор топика
Ответ на: комментарий от fifajan

Готово:

#!/bin/bash

res=`cat /proc/acpi/battery/C1AC/state | awk -vlim=10000 '/^remaining.*capacity/ { print ($3 <= lim) }'` exit $res

Спасибо за помощь!

fifajan
() автор топика
Ответ на: комментарий от svu

> Народ, нафига grep перед awk-ом? Если awk сам умеет фильтровать не хуже грепа.

Привычка, тем более что awk как-то, ИМХО, хуже освещен в прессе :) (В том плане, что он нем меньше говорят. Для решения сходных серьезных задач используют перл, соответственно функционал более сложный чем print $n попросту выпадает из поля зрения, может и зря)

> Аналогичный вопрос можно задать и про cat

Привычка, опять же, к юникс-вею (пусть и бесполезная с практической точки зрения)

Оправдался типа.

anonymous
()
Ответ на: комментарий от dilmah

> это дао ортогонального пайпа..

Ну или так, да

anonymous
()
Ответ на: комментарий от anonymous

> Для решения сходных серьезных задач используют перл, соответственно функционал более сложный чем print $n попросту выпадает из поля зрения

Ларри писал что он перл создал потому что не справился с awk:

Then the great Manager asked him to produce reports. Larry's first thought was "Let's use awk." Unfortunately, the awk of that day couldn't handle opening and closing of multiple files based on information in the files. Larry didn't want to have to code a special-purpose tool. As a result, a new language was born.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Да, а еще у Поля Грехема, кажется, было такое удачное сравнение, что-то вроде awk -- это детский розовый велосипед с корзинкой и клаксоном, а перл -- оттюнингованный спорткар (или как-то так). По-моему, был еще третий язык, соответственно выстраивалась градация, но я что-то запамятовал.

anonymous
()
Ответ на: комментарий от fifajan

cat /proc/acpi/battery/C1AC/state | awk -v res=1 -v lim=10000 '/^remaining.*capacity/ && $3<=lim {res=0}; END {exit res}'

sdio ★★★★★
()

[ $(awk '/remaining[[:space:]]*capacity/ { print $2 }') -gt 100 ]
вернет 0, если больше и 1, если меньше. Использовать можно так
[ $(awk '/remaining[[:space:]]*capacity/ { print $2 }') -gt 100 ] || shutdown -r now

anonymous
()
Ответ на: комментарий от anonymous

ой, забыл файл: [ $(awk '/remaining[[:space:]]*capacity/ { print $2 }' /proc/acpi/battery/C1AC/state) -gt 100 ]

anonymous
()
Ответ на: комментарий от anonymous

>По-моему, был еще третий язык, соответственно выстраивалась градация, но я что-то запамятовал.

Наверное, Python?

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.