Страница 1 из 2

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

Добавлено: 2012-01-23 14:37:52
killeo

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

# 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

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

Добавлено: 2012-01-23 15:11:41
bagas
у тебя ошибка в printf без конечной буквы f

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

Добавлено: 2012-01-23 15:39:10
kpp

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

awk '/192.168.11.2[ <->]/ {printf $2}' | sed -e 's/.\$//'
<-> - табуляции.
В awk есть и print и printf.

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

Добавлено: 2012-01-23 16:20:00
kpp
Можно без использования awk:

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

grep "192.168.11.2[ <-->]" | tr -s [" "] ">" | cut -f 2
<--> и > - табуляция

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

Добавлено: 2012-01-23 17:34:25
killeo
большое спасибо! с 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/.\$//'

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

Добавлено: 2012-01-23 18:01:24
kpp

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

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
Какое форматирование на выходе получить нужно?

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

Добавлено: 2012-01-23 18:25:21
killeo
форматирование на выходе 8741:31497

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

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

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

Добавлено: 2012-01-23 18:28:53
kpp

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

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

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

Добавлено: 2012-01-23 21:48:15
killeo
ну вот примерно так

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

#!/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
в логах чисто, а графка нету

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

Добавлено: 2012-01-23 23:23:09
killeo
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

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

Добавлено: 2012-01-23 23:30:44
mak_v_

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

| grep "192.168.0.5" | awk '{print $2" "$3" "$4}'

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

Добавлено: 2012-01-24 14:13:31
killeo
Спасибо! всё почти получилось
только не понятно, когда в теринале

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

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
...

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

Добавлено: 2012-01-24 14:18:20
mak_v_
зачем вы седом в конце выбираете?

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

Добавлено: 2012-01-24 14:39:45
kpp
Последнюю внесенную запись в файл.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:

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

Добавлено: 2012-01-24 15:06:45
mak_v_

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

!/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:
Не силён в регекспах. Я интересуюсь, зачем тут сед? Какую функцию регулярка выполняет?

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

Добавлено: 2012-01-24 15:11:17
kpp
2 mak_v_
Все мои вопросы предназначены автору. :smile:
Я сам не знаю зачем тут сед.
2 mak_v_
Зачем стрелять три раза из awk, если можно одним?

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

Добавлено: 2012-01-24 15:17:14
mak_v_
возможно..... разделитель ":" не воспринимается из переменной.
Просто уже надо всех ложить на поражение а не заниматься снайперством :-)....перебирать помагаю :

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

Добавлено: 2012-01-24 15:23:02
kpp

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

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

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

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

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

Добавлено: 2012-01-24 15:29:49
kpp
Можете считать меня занудой :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.

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

Добавлено: 2012-01-24 15:46:14
killeo
по поводу seg - просто скопировал строку с рабочего скрипта, хотя назначения не знаю, но результат выполнения, как с так и без, одинаковы.
и Спасибо за разъяснения и советы!

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

Добавлено: 2012-01-24 15:55:56
kpp
Результат не одинаковый! :-o
Если с этим sed - потеряете последнюю цифру в последнем числе.
И будут Ваши графики погоду показывать.
А если это число будет состоять из одной цифры - так вообще ошибка намечается.

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

Добавлено: 2012-01-24 16:03:58
killeo
Теперь увидел!

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

Добавлено: 2012-01-24 16:10:07
killeo
Подскажите пожалуйста, почему rrdtool lastupdate показывает, что данные внесены, а rrdtool fetch дату этого внесения не покаывает(ну и соответственно nan)

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

Добавлено: 2012-01-24 16:34:12
kpp
Я не эксперт по rrdtool, но думаю, что последняя запись типа "nan nan...nan" - это резерв под следущую запись.

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

Добавлено: 2012-05-10 19:20:33
Andrey__s
Есть файл:

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 переменной присвоить значение столбца содержащего /ааа/ и вывести на печать и т.д.