Значення вилучення між подвійними лапками


16

Мій запит - отримати значення між подвійними лапками "". Зразок введення:

10.219.41.68 - - - [11 / червня / 2014: 10: 23: 04 -0400] сек: 0 MicSec: 1797 "GET / балансир-менеджер HTTP / 1.1" 200 28980 "-" "curl / 7.15.5 (i386 -redhat-linux-gnu) libcurl / 7.15.5 OpenSSL / 0.9.8b zlib / 1.2.3 libidn / 0.6.5 "

У мене великі файли журналів, тому значення можуть бути різними для кожного рядка, потрібно отримати значення між першим виникненням подвійних лапок…

Очікуваний вихід:

GET /balancer-manager HTTP/1.1

У когось є ідея, то, будь ласка, підкажіть.


Відповіді:


27

Ви можете просто використовувати cutдля цього:

$cut -d '"' -f2 < logfile
GET /balancer-manager HTTP/1.1

-d '"'говорить cutвикористовувати подвійну лапку як роздільник поля. -f2говорить про те, щоб зайняти друге поле, яке знаходиться між першою та другою лапочками - або першим рядком, що цитується, саме те, що потрібно.


Як легко надрукувати всі парні стовпці в розрізі %!cut -d '"' -f2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58?
hhh

10

Спосіб використання awk

awk -F'"' '$0=$2' file

Якщо з якихось абсурдних причин ваші методи HTTP є насправді, 0і ви хочете вивести їх

awk -F'"' '{$0=$2}1' file

Що робити, якщо $2нуль?
cuonglm

Тоді це не буде надрукувати? Те саме, що було у вашій відповіді. Єдина відмінність полягає у тому, що ваша відповідь надрукує порожній рядок для кожного запису без 2 доларів.

Ні, моя відповідь друкує бланк, як. А уявіть, що значення є 0не тільки нульовим?
cuonglm

Я б уявив, враховуючи контекст питання, який би не був проблемою.

Дякую всім за швидкі відповіді ... Мені це дуже корисно. Дуже дякую!
користувач79658

4

Оскільки рішення awkта perlрішення вже надані, я хотів спробувати sed:

sed 's/[^"]*"\([^"]*\)".*/\1/' file

2

Зробити це можна багатьма способами.

З awk:

$ awk -F'"' '{print $2}' file
GET /balancer-manager HTTP/1.1

З perl:

$ perl -F'"' -anle 'print $F[1]' file
GET /balancer-manager HTTP/1.1

0

обробка цитованих вхідних номерів

echo   1234   | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # no problem
echo '"1234"' | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # does not work
echo '"1234"' | awk '{ gsub("\"",""); i = $1         ;  printf( "%s %d\n",$1, i)}'  # works

Постарайтеся бути трохи докладнішими у своїй відповіді
ddnomad
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.