Форум русскоязычного сообщества Ubuntu


Автор Тема: Bash-скриптинг  (Прочитано 270 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Bash-скриптинг
« : 04 Июль 2016, 09:57:41 »
Доброго всем! Учусь писать скрипты на баше, получил учебное задание:
Напишите скрипт , который берет информацию из команды ifconfig для отображения текущей скорости сетевого подключения в Кбит/сек и Мбит/сек (свыше 1024 Кбит/сек)...
Все понятно, скрипт готов. !Но хотелось бы знать правильно ли я все сделал? Быть может можно все сделать проще? В общем жду критики :D

#!/bin/bash

while true;
do
#Считываем показания RX/TX в байтах
zerosecondrx=$(ifconfig | grep -A6 Bcast | tail -n 1 | awk '{print$2}'| cut -d : -f 2)
zerosecondtx=$(ifconfig | grep -A6 Bcast | tail -n 1 | awk '{print$6}'| cut -d : -f 2)

#Спим)
sleep 1

#Считываем RX/TX снова
firstsecondrx=$(ifconfig | grep -A6 Bcast | tail -n 1 | awk '{print$2}'| cut -d : -f 2)
firstsecondtx=$(ifconfig | grep -A6 Bcast | tail -n 1 | awk '{print$6}'| cut -d : -f 2)

#получаем разницу между firstsecondrx и zerosecondrx и переводим в Кбит'ы
currentrx=$((($firstsecondrx - $zerosecondrx) * 8 / 1024 ))
currenttx=$((($firstsecondtx - $zerosecondtx) * 8 / 1024 ))

#по другому не додумался, что бы не сыпало выводом в терминал
clear

#определяем когда отображать Кбит'ы, когда Мбит'ы для RX и выводим это все дело
if [ "$currentrx" -gt 1024 ]
then
currentrxm=$(($currentrx / 1024))
echo RX "$currentrxm" Mbit/sec
else
echo RX "$currentrx" Kbit/sec
fi

#определяем когда отображать Кбит'ы, когда Мбит'ы для TX и выводим это все дело
if [ "$currenttx" -gt 1024 ]
then
currenttxm=$(($currenttx / 1024))
echo TX "$currenttxm" Mbit/sec
else
echo TX "$currenttx" Kbit/sec
fi

done;

« Последнее редактирование: 04 Июль 2016, 10:45:25 от BloodyFRag »

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3538
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
    • LinkedIn
Re: Bash-скриптинг
« Ответ #1 : 04 Июль 2016, 10:29:45 »
Вместо clear можно
echo -n 111111
sleep 2
echo -ne "\e[0K\r222222"
sleep 2
echo -ne "\e[0K\r333333"
Но для многострочного вывода не приходилось делать. Тут можно в одну строку уместить при желании.
Не опускай рук, а то пропустишь в бороду

Оффлайн lumberjack

  • Активист
  • *
  • Сообщений: 284
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #2 : 04 Июль 2016, 11:07:41 »
имхо
| grep -A6 Bcast | tail -n 1 | awk '{print$2}'| cut -d : -f 2лучше заменить на ченть типа
| awk 'NR == 4{print$5}'

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #3 : 04 Июль 2016, 11:34:36 »
Дмитрий Бо, думал быть может есть какое то универсальное решение, но коль уж так, то лучше лучше оставлю clear. Спасибо
lumberjack, "Краткость - сестра таланта", учту. Спасибо
P.S. знал бы хорошо sed обошелся бы без grep,awk,cut, но увы...

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #4 : 04 Июль 2016, 12:02:07 »
ifconfig | grep -A6 BcastЭто какое-то неправильное определение. Если нужен конкретный интерфейс его и указывайте
Строчек может быть больше/меньше — брать нужно конкретно те которые требуютсяifconfig wlan0 | sed '/\s*[RT]X bytes:/s/[: ]\+/\n/g;/^[0-9]\+\n/P;D'Для хранения значений я бы использовал массив mapfile -t < <(ifconfig wlan0 | sed '/\s*[RT]X bytes:/s/[: ]\+/\n/g;/^[0-9]\+\n/P;D')
mapfile -t -O 2 < <(ifconfig wlan0 | sed '/\s*[RT]X bytes:/s/[: ]\+/\n/g;/^[0-9]\+\n/P;D')
Ну и для конверсии стоит использовать numfmti=0
for D in RX TX
do
    echo $D "$((${MAPFILE[i+2]} - ${MAPFILE[i]}))" | numfmt --to=iec --suffix=ib/sec --field 2
    ((i++))
done
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #5 : 04 Июль 2016, 12:20:44 »
Azure,
я специально так сделал:
ifconfig | grep -A6 Bcast ...на случай если интерфейсы в разных системах называются по разному(у меня, например, дома p1p1, на работе eth0, на сервере em1) по другому как решить данную задачу не придумал...
Все что Вы написали ниже для меня темный лес (с sedом еще более менее понятно...). Ну что ж, есть над чем подумать и чему учиться. Спасибо

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #6 : 04 Июль 2016, 12:43:53 »
Не так всё страшно ;)
Можно grep'омgrep -oP '(?<=[RT]X bytes:)[0-9]+'ну или если mapfile такой "страшный"for i in 0 1 ; do
    read RX[i] TX[i] < <(ifconfig wlan0 | sed -n '/X b/s/[^:]*:\([0-9]\+\)[^:]*/\1\t/gp')
done
Для поиска работающего интерфейса обычно используют маршрут по умолчаниюip r | sed '/default.*dev\s\+/{s///;s/\s/\n/;P};D'
« Последнее редактирование: 04 Июль 2016, 12:49:30 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #7 : 04 Июль 2016, 14:00:35 »
Azure,
Можно grep'ом

За grep спасибо)

Цитировать
ну или если mapfile такой "страшный"

Скорее пока непонятный.

Цитировать
ip r | sed '/default.*dev\s\+/{s///;s/\s/\n/;P};D'
за ip r, спасибо, не знал, но по-моему так:
ip r | awk 'NR==1{print$5}'меньше кода :)

P.S. не то что бы я не хочу использовать sed, просто не хотелось бы страдать копи/пастом.
Быть может подскажите какую нибудь литературу по SEDу? а то когда вижу подобную кучу символов, значения которых не понимаю аж глаз начинает дергаться ;)

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3095
  • Ubuntu Mate 16.04 х64
    • Просмотр профиля
Fujitsu UH552: Intel Core i3-3217U, 16GB DDR3 1600MHz, Intel HD4000, Intel 535 120GB/Ubuntu 16.04 Mate
HP 625: AMD Athlon P320, 4GB DDR3 1333MHz, AMD HD4250, Seagate Momentus/Ubuntu 14.04 Mate

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Bash-скриптинг
« Ответ #9 : 04 Июль 2016, 15:32:51 »
Вы же скрипт всё равно пишите, какая разница сколько символов в коде? sed (а тем более grep) по умолчанию быстрее awkip r | grep -oP 'def.*dev\s+\K\S+'
ip r | sed -n '/^d.*dev \(\S\+\).*/s//\1/p'
ip r | grep 'default' | cut -f5 -d" "
ip r | awk '/default/{print $5}'
awk — это вообще целый псевдо-язык, если уже его «трогать» тогда на нём весь скрипт и написать.
Что касается изучения sed, то самое структурированное это http://www.grymoire.com/Unix/Sed.html. Для общего понимания стоит пролистнуть O'Reilly`s sed & awk или хотя бы даже просто Wiki
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.059 секунд. Запросов: 24.