From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <3E78CCF0.8000508@14000.ru> Date: Wed, 19 Mar 2003 23:02:56 +0300 From: Vadim Vinichenko User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ru-RU; rv:1.2.1) Gecko/20021123 X-Accept-Language: en-us, ru MIME-Version: 1.0 To: community@altlinux.ru Subject: Re: [Comm] awk question References: <3E7789D7.602@14000.ru> <20030319054529.59917b05.laedel@pochtamt.ru> In-Reply-To: <20030319054529.59917b05.laedel@pochtamt.ru> Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Sender: community-admin@altlinux.ru Errors-To: community-admin@altlinux.ru X-BeenThere: community@altlinux.ru X-Mailman-Version: 2.0.9 Precedence: bulk Reply-To: community@altlinux.ru List-Unsubscribe: , List-Id: List-Post: List-Help: List-Subscribe: , List-Archive: Archived-At: List-Archive: List-Post: Olga пишет: > Vadim Vinichenko пишет: > > >>Уважаемые коллеги, >> >>Подскажите, пожалуйста, можно ли, используя 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], # по крайней мере, если закавыченные поля не сбивают счет нужных # "обычных" полей, идущих за ними } Но вообще мне в awk'е не хватает той возможности, о которой я писал изначально - игнорировать разделители в закавыченной (или взятой в "скобки" из заданных символов) подстроке. Так бы оно было чище и прямее... Похоже, такого действительно нет:-( А еще не хватает функции под (условным) названием getsub(r, n [, t]), которая не замену бы выполняла (как sub'ы), и не возвращала позицию начала совпадения (как match), а возвращала бы саму совпадающую строку (n - чтобы вернуть n-ое совпадение). -- С уважением, Вадим