URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9426
[ Назад ]

Исходное сообщение
"Извлеч значение из процедуры awk"

Отправлено oleg_skat , 07-Апр-12 13:04 
Доброго времени!

Хочу обратиться за консультацией. Вопрос по оптимизации скрипта.

Имеется скрипт, где AWK  создаёт отчёт:
(фрагмент)
....................
awk 'count+=$7;
         BEGIN {
print "Адр.источник       Порт     Адр.назначения    Порт   Протокол   Байт     Всего \n--------------------------------------------------------------------|"
                }
       END {
print "\n------------------------------------------------------------------------------- \n income   Суммарный входящий трафик с начала месяца(байт):" \
  count;    }' > $doc_in 2>&1
.............

В разультате, получаем отчёт с разобранной статистикой трафика и подсчитанным количеством байт в конце файла.
Но есть желание результаты подсчёта складывать в отдельный файл. Можно, конечно, написать так:
awk '{count+=$7}; END { print count}' $doc_in >> $total или воспользоваться функцией substr(), но ведь это не рационально....Перелапачивать заново весь файл? подсчёт-то уже выполнен.

Может быть, есть мнения, как извлеч значение переменной count за рамки AWK?


Содержание

Сообщения в этом обсуждении
"Извлеч значение из процедуры awk"
Отправлено cat84 , 07-Апр-12 16:38 
Попробуй так...
END { print "bla" >> "/path/to/text.file";}'
на старых unix system-v, типа sco, работало.

"Извлеч значение из процедуры awk"
Отправлено oleg_skat , 07-Апр-12 17:26 
> Попробуй так...
> END { print "bla" >> "/path/to/text.file";}'
> на старых unix system-v, типа sco, работало.

Точно.... помимо существующей, создать ещё процедуру и в ней отправить значение из существующей переменной.
  END { ............ count;} END {print count > "./filename";}' .....
Отлично работает и на FreeBSD8.2

СПАСИБО!



"Извлеч значение из процедуры awk"
Отправлено oleg_skat , 07-Апр-12 19:06 
>> Попробуй так...
>> END { print "bla" >> "/path/to/text.file";}'
>> на старых unix system-v, типа sco, работало.
> Точно.... помимо существующей, создать ещё процедуру и в ней отправить значение из
> существующей переменной.
>   END { ............ count;} END {print count > "./filename";}' .....

в файл пишет, в переменную не хочет.. Да и как сюда мия переменной подставить, чтоб эта переменная была доступна после отработки awk? ... переменные видны только внутри одинарных ковычек Получается, только через временный файл.
Или я не прав?


"Извлеч значение из процедуры awk"
Отправлено cat84 , 09-Апр-12 15:18 
`expression` ?


"Извлеч значение из процедуры awk"
Отправлено LSTemp , 27-Апр-12 21:48 
>[оверквотинг удален]
>>> END { print "bla" >> "/path/to/text.file";}'
>>> на старых unix system-v, типа sco, работало.
>> Точно.... помимо существующей, создать ещё процедуру и в ней отправить значение из
>> существующей переменной.
>>   END { ............ count;} END {print count > "./filename";}' .....
>  в файл пишет, в переменную не хочет.. Да и как сюда
> мия переменной подставить, чтоб эта переменная была доступна после отработки awk?
> ... переменные видны только внутри одинарных ковычек Получается, только через временный
> файл.
> Или я не прав?

в принципе - прав. практически все циклы, операции перенаправления ввода, вызов внешних команд выполняются в отдельной оболочке - именно по этому значение переменной и не сохраняется (при выходе из сабшела она просто теряется). однако можно так например:

[root@local temp]# cat n.bsh
#!/bin/bash

# file name
n_f='./n.txt'

# exec
function n_e()
{
echo 1 >> $n_f
echo 2
echo 3 >> $n_f
}

# print
function n_p()
{
n_e|\
while read n
do
    echo $n
done
}

# go
n_p

[root@local temp]# ./n.bsh
2
[root@local temp]# cat n.txt
1
3

фактически - это тоже использоание временных файлов для передачи значения переменной (хоть и не явно), но код более прозрачен для понимания.