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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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;


ТС не появлялся на Форуме более полугода по состоянию на 14/07/2019 (последняя явка: 02/07/2018). Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 14 Июля 2019, 01:17:47 от zg_nico »

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

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
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

  • Активист
  • *
  • Сообщений: 293
    • Просмотр профиля
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

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
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

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
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

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
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.052 секунд. Запросов: 23.