[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