The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Извлеч значение из процедуры awk"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Извлеч значение из процедуры awk"  +/
Сообщение от oleg_skat email(ok) on 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?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Извлеч значение из процедуры awk"  +/
Сообщение от cat84 email(ok) on 07-Апр-12, 16:38 
Попробуй так...
END { print "bla" >> "/path/to/text.file";}'
на старых unix system-v, типа sco, работало.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

СПАСИБО!


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Извлеч значение из процедуры awk"  –1 +/
Сообщение от cat84 email(ok) on 09-Апр-12, 15:18 
`expression` ?

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Извлеч значение из процедуры awk"  +/
Сообщение от LSTemp (ok) on 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

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


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2023 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру