LINUX.ORG.RU
решено ФорумAdmin

Bash Сложение чисел выводящихся построково

 


1

1

Не знаю как в этой строке продолжить кода чтобы получить конечную сумму

ethtool -S eth0 | grep "ucast pkts tx" | cut -d":" -f2
 672170
 573638

Пробовал так:

# ethtool -S eth0 | grep "ucast pkts tx" | cut -d":" -f2|while read n; do  s=$(($s+$n)); echo "n=$n"; echo "s=$s"; done; echo $s
n=672220
s=672220
n=573643
s=1245863
0
Но почему-то все правильно пока не выходит из цикла while. А в итоге опять ноль.


Потому что пайп - сопроцесс, все переменные в "...| while ... done;" — его внутренние. Оберните в круглые скобки "... | ( while .....; echo $s)"

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

Оно было б прикольно, если б не понимал, что именно так теперь все и делают: запускают сопроцессами grep + cut+awk+ (а тут проскакивало еще и «awk {system(sed...» ). А потом жалуются, что всё тормозит и память жрёт... Ну нахрена, юзая awk, юзать grep+cut ? А awk юзать как калькулятор...

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Согласен. Если юзать grep+cut, то как калькулятор можно взять bc (правда это то же то ещё извращение, но если вычисления сложные, почему бы и нет).

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
$ seq 1 10 | perl -nle '$a += $_ }{ print $a'
55
anonymous
()
Ответ на: комментарий от Shinma

Просто. Берешь и передаешь в bc выражение, которое нужно посчитать (правда тогда тебе надо выражение со знаками формировать средствами bash, это может быть нужно в очень редких случаях, если bash используется немного не по назначению, когда его по хорошему надо менять на какой-нибудь Python или вообще что-то более серьезное, но ты хорошо знаешь только bash и учить что-то новое не хочешь), но в твоем случае это не требуется, как я понял. А пересчет можно и средствами bash выполнить. У тебя же он не получается только из-за того, что pipe это сопроцесс, по идее vodz написал что делать в первом сообщении.

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

Если бы я писал с 0 я, разумеется, не мешал бы авк, кат и греп в одном пайпе. Я не стал оптимизировать выражение просто для того, чтобы ответ был понятнее.

PS grep 88кб, cut 76 кб, awk 324 кб - думаю, это терпимо, на фоне современных демонов на питоне и ноде.

PS

$ pv /tmp/garbage | grep ... | cut -f1,2,3,4 | awk '{}' > /dev/null
2,01GiB 0:00:15 [ 136MiB/s] [=============================================================================>] 100%            
$ pv /tmp/garbage | awk '/.../ { print $1,$2,$3,$4}' > /dev/null
2,01GiB 0:00:27 [74,1MiB/s] [=============================================================================>] 100% 
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Спасибо. В итоге у меня два рабочих варинта


s=0;for i in $(/usr/sbin/ethtool -S eth0 | grep "ucast pkts tx" | cut -d":" -f2); do s=$(($s+$i)); done; echo $s
s=0;/usr/sbin/ethtool -S eth0 | grep "ucast pkts tx" | cut -d":" -f2|(while read n; do  s=$(($s+$n)); done; echo $s)
[\code]
Но скрипт запускается вручную для редкого мониторинга, поэтому я не шибко влезаю в оптимизацию. Лишь бы информацию выдавал когда нужно.

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

чтобы ответ был понятнее

надо прежде всего не юзать awk было.

PS

Это у вас громадное передёргивание. ethtool не формирует гигабайты мусора, потому пока вы будете вызывать 3 pipe(), 3 fork-а и юзать сплошные write+read, awk это уже давно посчитает.

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

Учтите, это у вас жутко не стандартный мониторинг будет. У меня ethtool ключ -S поддерживает, но нет никакого «ucast pkts tx».

В итоге у меня два рабочих варинта

Ну какое извращение однако... Ну можно же сделать по нормальному:

while IFS=': ' read  l v ; do 
    [ "tx_packets" = "$l" ] && ((s+=v))  
done < <(ethtool -S eth0)
echo $s
(это в ethtool version 2.6.36 так отправленные пакеты показывает)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

На разных сетевых картах ввод ethtool разный. Я очень сильно удивился моему выводу. Я всегда думал, что вывод имеет один вид как у вас, оказалось, что нет.

Вот ссылка в соседней теме по разбору лога который выводится у меня на некоторых сетевых картах:

ethtool научите пользоваться (комментарий)

там вывод будет другой. Так же у меня есть карты где 4 аппаратные очереди. А в логе по ссылке карта с двумя очередями. Поэтому я сделал как указал выше.

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

Я смотрел в эту сторону, но мне не понравилось, что данный вывод показывает ВСЕ пакеты. А мне надо было исключить бродкасты. так как я ловлю мониторинг с интерфейсов бондинга. и нужно видеть точно где ноль по данным, а передача бродкастов портит картину.

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