[Comm] awk question

Vadim Vinichenko =?iso-8859-1?q?vnv_=CE=C1_14000=2Eru?=
Ср Мар 19 23:02:56 MSK 2003


Olga пишет:
> Vadim Vinichenko <vnv на 14000.ru> пишет:
> 
> 
>>Уважаемые коллеги,
>>
>>Подскажите, пожалуйста, можно ли, используя awk (разделитель - пробел), 
>>заставить его считать подстроку в кавычках одним полем, независимо от 
>>наличия пробелов внутри. То есть, для:
>>
>>aaa bbb "ccc ddd eee"
>>
>>$3 должно быть равно "ccc ddd eee" (или ccc ddd eee, без кавычек).
>>
>>Я, собственно, разбираю лог веб-сервера, а там строка идентификации 
>>агента содержит пробелы. Что-то я не могу найти ответа на свой вопрос в 
>>документации. Или это уже не к awk?
> 
> 
> Если нужны все поля, то можно выдрать из строки заковыченное и использовать
> отдельно (параллельно с оставшейся частью).
> Примерно так (ведь в логе, кажется, только одно заковыченное поле):
> {quot=$0; gsub("(.* \"|\" .*)", "", quot);  gsub("\".*\"", ""); 
> #собственно обработка quot и полей из $0
> }
> заковыченное будет в переменной quot, остальное - в $0, которую можно
> анализировать как обычно.

Ольга, спасибо! Закавыченных полей там, правда, несколько, но Ваш пример 
все равно помог, поскольку поле агента стоит последним, а жадный regexp 
сожрал все вплоть до последней открывающей кавычки.

> Ну а если нужно только заковыченное - проще переопределить разделитель:
> gawk -F \" 'Ваш скрипт'

Да. А если нужны и те, и другие, то можно еще сказать так:
{split($0,myarray,"\"");
# а потом использовать как обычные $n, так и myarray[n],
# по крайней мере, если закавыченные поля не сбивают счет нужных
# "обычных" полей, идущих за ними
}

<grumbling>
Но вообще мне в awk'е не хватает той возможности, о которой я писал 
изначально - игнорировать разделители в закавыченной (или взятой в 
"скобки" из заданных символов) подстроке. Так бы оно было чище и 
прямее... Похоже, такого действительно нет:-(

А еще не хватает функции под (условным) названием getsub(r, n [, t]), 
которая не замену бы выполняла (как sub'ы), и не возвращала позицию 
начала совпадения (как match), а возвращала бы саму совпадающую строку 
(n - чтобы вернуть n-ое совпадение).
</grumbling>

-- 
С уважением,
Вадим




Подробная информация о списке рассылки community