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

Исходное сообщение
"sed & awk & tail"

Отправлено sickboy , 19-Окт-07 17:44 
Скрипт:
tail -f file | sed -n -e 's/.*aaa\(qq.*HH)@blbla$/\1/p'
выводит в столбик слова, например,
ssss
vvvv
eeee
sasss
eee
4444
vvvv

Дальше так:
tail -f file | sed -n -e 's/.*aaa\(qq.*HH)@blbla$/\1/p' | awk '{print$1}'
ничего не выводит, а надо.
В чем тут грабли?


Содержание

Сообщения в этом обсуждении
"sed & awk & tail"
Отправлено pavel_simple , 19-Окт-07 17:59 
... awk '{print$1}'
может пробела не зватает ??
'{print $1}'

"sed & awk & tail"
Отправлено sickboy , 19-Окт-07 18:08 
>... awk '{print$1}'
>может пробела не зватает ??
>'{print $1}'

Нет, тоже самое.


"sed & awk & tail"
Отправлено angra , 19-Окт-07 18:03 
Не совсем понятно, если и так получается один столбик, то зачем awk?

"sed & awk & tail"
Отправлено sickboy , 19-Окт-07 18:09 
>Не совсем понятно, если и так получается один столбик, то зачем awk?

Планируется еще много чего в самом awk, т.е. мне главное получить значение от предыдущей команды и передать его в awk для дальнейшей обработки.



"sed & awk & tail"
Отправлено pavel_simple , 19-Окт-07 18:16 
for ((i=1;i<5;i++)); do echo $i;done | awk '{print $1}'
1
2
3
4

"sed & awk & tail"
Отправлено sickboy , 19-Окт-07 18:18 
>for ((i=1;i<5;i++)); do echo $i;done | awk '{print $1}'
>1
>2
>3
>4

Ага, можно еще проще,
echo 1 | awk '{print $1}'
1

Тут чего-то не так с sed'ом.


"sed & awk & tail"
Отправлено pavel_simple , 19-Окт-07 18:24 
tail -f file | sed -n -e 's/.*aaa\(qq.*HH)@blbla$/\1/p' 2>&1 | awk '{print $1}'
будет работать?

"sed & awk & tail"
Отправлено sickboy , 19-Окт-07 18:27 
>tail -f file | sed -n -e 's/.*aaa\(qq.*HH)@blbla$/\1/p' 2>&1 | awk '{print $1}'
>будет работать?

Увы, тоже нет.


"sed & awk & tail"
Отправлено pavel_simple , 19-Окт-07 18:30 
>Увы, тоже нет.

Будет интересно узнать из-за чего же всё-таки такая нереальная байда получается


"sed & awk & tail"
Отправлено jd , 19-Окт-07 20:15 
>Тут чего-то не так с sed'ом.

Скорее всего дело в буферизировании вывода. Если данные, поступающие на вход, закончатся (EOF), то он должен всё выдать. В противном случае он будет выдавать данные порциями, когда буфер заполнится. По крайней мере мой sed так себя ведёт. В новых версиях GNU sed на этот случай есть опция -u. man sed:


...
-u, --unbuffered

          load minimal amounts of data from the input files and flush  the
          output buffers more often
...
sed version 4.1.4         December 2005                SED(1)



"sed & awk & tail"
Отправлено sickboy , 19-Окт-07 21:24 
>Скорее всего дело в буферизировании вывода...

Круто.
Спасибо.