awk прошу помощи

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-23 14:37:52

Код: Выделить всё

# IPFMv0.11.5 2012/01/23 12:55:00 (local time) -- dump every 0d00:05:00 -- listening on fxp0
# Host                                  In (bytes)    Out (bytes)  Total (bytes)
192.168.11.2                                  8741          31497          40238
192.168.11.4                             437888443        6576316      444464759
192.168.11.5                                   800            640           1440
192.168.11.6                                 25653          48952          74605
192.168.11.7                                 33303          36697          70000
192.168.11.8                               2011169       32034827       34045996
192.168.11.9                                244655          84210         328865
192.168.11.10                                32021          49714          81735
192.168.11.18                              6571711         393276        6964987
192.168.11.23                              2217622       98022074      100239696
192.168.11.24                               225904         773775         999679
192.168.11.25                            393368187       10739065      404107252
192.168.11.29                              3798035         133903        3931938
192.168.11.255                                2018              0           2018
# end of dump 2012/01/23 12:55:00
awk '/192.168.11.2/ {printf $2}' | sed -e 's/.\$//'
выводит
8741221762222590439336818737980352018
т.е. 192.168.11.2,192.168.11.23,и т.д.
как всё-таки вывести значение именно для 192.168.11.2

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение bagas » 2012-01-23 15:11:41

у тебя ошибка в printf без конечной буквы f
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-23 15:39:10

Код: Выделить всё

awk '/192.168.11.2[ <->]/ {printf $2}' | sed -e 's/.\$//'
<-> - табуляции.
В awk есть и print и printf.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-23 16:20:00

Можно без использования awk:

Код: Выделить всё

grep "192.168.11.2[ <-->]" | tr -s [" "] ">" | cut -f 2
<--> и > - табуляция
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-23 17:34:25

большое спасибо! с awk всё получилось, а с grep

Код: Выделить всё

cat /home/a | grep '"192.168.11.2[ <-->]" | tr -s [" "] ">" | cut -f 2' > /home/tmp2
grep: Invalid range end
ещё хотел спросить
почеу не работает

Код: Выделить всё

 cat /home/a | awk '/192.168.11.2[ <->]/ {printf $2 \":\" $3}' | sed -e 's/.\$//' > /home/tmp2
awk: syntax error at source line 1
 context is
	/192.168.11.2[ <->]/ {printf $2 >>>  \ <<< ":\" $3}
awk: illegal statement at source line 1
хотя в рабочем скрипте

Код: Выделить всё

cat \$TMPFILE | awk '/In4\/Block|Out4\/Block/ {printf \$6 \":\"}'|sed -e 's/.\$//'

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-23 18:01:24

Код: Выделить всё

grep "192.168.11.2[ <-->]" /home/a | tr -s [" "] ">" | cut -f 2 > /home/tmp2
или

Код: Выделить всё

cat /home/a | grep "192.168.11.2[ <-->]" | tr -s [" "] ">" | cut -f 2 > /home/tmp2
но первый вариант предпочтителен.

Код: Выделить всё

awk '/192.168.11.2[ <->]/ {printf $2 ":" $3}' /home/a | sed -e 's/.\$//' > /home/tmp2
Какое форматирование на выходе получить нужно?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-23 18:25:21

форматирование на выходе 8741:31497

Код: Выделить всё

awk '/192.168.11.2[ <->]/ {printf $2 ":" $3}' /home/a | sed -e 's/.\$//' > /home/tmp2
с этим справляется. Большое спасибо! (осталось разобраться как-то это в *.rrd внести )

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-23 18:28:53

Код: Выделить всё

/usr/local/bin/rrdtool update имя_файла.rrd N:$значенией:$значение2:$значение3 и т.д.
Предварительно имя_файла.rrd создать нужно.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-23 21:48:15

ну вот примерно так

Код: Выделить всё

#!/bin/sh
BASE="/var/db/rrd"
HOSTDIR="$BASE/"
HOSTLIST="192.168.11.2"
mkdir -p $HOSTDIR
                for i in $HOSTLIST
                do
                        rrdtool create $HOSTDIR/$i.rrd      \
                        DS:In:COUNTER:120:U:U     \
                        DS:Out:COUNTER:120:U:U    \
                        DS:Total:COUNTER:120:U:U  \
                        RRA:AVERAGE:0.5:1:6000 \
                        RRA:AVERAGE:0.5:5:6000 \
                        RRA:AVERAGE:0.5:30:7000 \
                        RRA:AVERAGE:0.5:120:7750 \
                        RRA:MAX:0.5:1:6000 \                       
                        RRA:MAX:0.5:5:6000 \
                        RRA:MAX:0.5:30:7000 \
                        RRA:MAX:0.5:120:7970 \
                        RRA:MIN:0.5:1:6000 \
                        RRA:MIN:0.5:5:6000 \
                        RRA:MIN:0.5:30:7000
                done
                        unset BYTES
                        BYTES="`cat /var/log/ipfm/all-01.23 | awk '/192.168.11.2[ <->]/ {printf $2 ":" $3 ":" $4}'|sed -e 's/.$//'`"
                        /usr/local/bin/rrdtool update /var/db/rrd/192.168.11.2.rrd N:$BYTES
в логах чисто, а графка нету

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-23 23:23:09

rrdtool fetch /var/db/rrd/192.168.11.2.rrd AVERAGE

Код: Выделить всё

                             In                 Out               Total

1327263600: nan nan nan
1327263900: nan nan nan
1327264200: nan nan nan


killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-24 14:13:31

Спасибо! всё почти получилось
только не понятно, когда в теринале

Код: Выделить всё

cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $2 ":" $3 ":" $4}'|sed -e 's/.$//' > /home/tmp
то вывод 1098:1731:282(к примеру).
когда в скрипте

Код: Выделить всё

#!/bin/sh
A="`cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $2 ":" $3 ":" $4}'|sed -e 's/.$//'`"
/usr/bin/nice -n20 /usr/local/bin/rrdtool update /var/db/rrd/192.168.11.2.rrd N:$A
то
# rrdtool fetch /var/db/rrd/192.168.11.2.rrd AVERAGE

Код: Выделить всё

...
1327401900: nan nan nan
1327402800: nan nan nan
1327403700: nan nan nan
...


kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 14:39:45

Последнюю внесенную запись в файл.rrd удобнее смотреть:

Код: Выделить всё

rrdtool lastupdate /var/db/rrd/192.168.11.2.rrd
Это:

Код: Выделить всё

A="`cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $2 ":" $3 ":" $4}'|sed -e 's/.$//'`"
лучше преобразовать к виду:

Код: Выделить всё

A="`grep "192.168.11.2[ <->]" /var/log/ipfm/all-01.23 | awk '{print $2 ":" $3 ":" $4}'`"
Зачем

Код: Выделить всё

sed -e 's/.$//' 
? Какой последний символ в строке Вам не нравится? :roll:
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mak_v_
проходил мимо

Re: awk прошу помощи

Непрочитанное сообщение mak_v_ » 2012-01-24 15:06:45

Код: Выделить всё

!/bin/sh
A=`/bin/cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $2}'
B=`/bin/cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $3}'
C=`/bin/cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $4}'
/usr/bin/nice -n20 /usr/local/bin/rrdtool update /var/db/rrd/192.168.11.2.rrd N:$A:$B:$C
? Какой последний символ в строке Вам не нравится? :roll:
Не силён в регекспах. Я интересуюсь, зачем тут сед? Какую функцию регулярка выполняет?

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 15:11:17

2 mak_v_
Все мои вопросы предназначены автору. :smile:
Я сам не знаю зачем тут сед.
2 mak_v_
Зачем стрелять три раза из awk, если можно одним?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mak_v_
проходил мимо

Re: awk прошу помощи

Непрочитанное сообщение mak_v_ » 2012-01-24 15:17:14

возможно..... разделитель ":" не воспринимается из переменной.
Просто уже надо всех ложить на поражение а не заниматься снайперством :-)....перебирать помагаю :

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 15:23:02

Код: Выделить всё

sed -e 's/.$//'
эквивалент

Код: Выделить всё

sed 's/.$//'
, потому как команда редактирования всего одна.
Возвращает исходную\ные строку\и без последнего символа.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 15:29:49

Можете считать меня занудой :pardon: , но вместо

Код: Выделить всё

A=`/bin/cat /var/log/ipfm/all-01.23 | grep "192.168.11.2[ <->]" | awk '{print $2}'
не скажу "правильней", скажу - "оптимальней" делать так:

Код: Выделить всё

A=`grep "192.168.11.2[ <->]" /var/log/ipfm/all-01.23 | cut -f 2
- если разделитель табуляция или

Код: Выделить всё

A=`grep "192.168.11.2[ <->]" /var/log/ipfm/all-01.23 | cut -d" " -f 2
- если разделитель - пробел
У каждой команды есть возможность считать файл самостоятельно.
Для банального получения значения поля лучше использовать cut чем awk.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-24 15:46:14

по поводу seg - просто скопировал строку с рабочего скрипта, хотя назначения не знаю, но результат выполнения, как с так и без, одинаковы.
и Спасибо за разъяснения и советы!

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 15:55:56

Результат не одинаковый! :-o
Если с этим sed - потеряете последнюю цифру в последнем числе.
И будут Ваши графики погоду показывать.
А если это число будет состоять из одной цифры - так вообще ошибка намечается.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-24 16:03:58

Теперь увидел!

killeo
рядовой
Сообщения: 11
Зарегистрирован: 2012-01-04 22:24:47

Re: awk прошу помощи

Непрочитанное сообщение killeo » 2012-01-24 16:10:07

Подскажите пожалуйста, почему rrdtool lastupdate показывает, что данные внесены, а rrdtool fetch дату этого внесения не покаывает(ну и соответственно nan)

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: awk прошу помощи

Непрочитанное сообщение kpp » 2012-01-24 16:34:12

Я не эксперт по rrdtool, но думаю, что последняя запись типа "nan nan...nan" - это резерв под следущую запись.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Andrey__s
проходил мимо

Re: awk прошу помощи

Непрочитанное сообщение Andrey__s » 2012-05-10 19:20:33

Есть файл:

aaa=1 bbb=2 ccc=3 ddd=4 eee=5
bbb=3 ccc=4 ddd=5 eee=1 aaa=2
ccc=5 ddd=1 eee=2 aaa=3 bbb=4
ddd=2 eee=3 aaa=4 bbb=5 ccc=1
eee=4 aaa=5 bbb=1 ccc=2 ddd=3

Как с помощью AWK или чего другого получить:
1.)
1 aaa=1
2 aaa=2
3 aaa=3
4 aaa=4
5 aaa=5

2.)
1 aaa=1 bbb=2 ccc=3 ddd=4 eee=5
2 aaa=2 bbb=3 ccc=4 ddd=5 eee=1
3 aaa=3 bbb=4 ccc=5 ddd=1 eee=2
4 aaa=4 bbb=5 ccc=1 ddd=2 eee=3
5 aaa=5 bbb=1 ccc=2 ddd=3 eee=4

Грубо говоря как в awk переменной присвоить значение столбца содержащего /ааа/ и вывести на печать и т.д.