Извлечь значение между двойными кавычками


16

Мой запрос состоит в том, чтобы извлечь значение между двойными кавычками "". Пример ввода:

10.219.41.68 - - - [11 / Jun / 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

Что делать, если $2NULL?
cuonglm

Тогда это не будет печатать это? Так же, как и в вашем ответе. Разница лишь в том, что ваш ответ будет печатать пустую строку для каждой записи без 2 $.

Нет, мой ответ распечатайте как пробел. И представь, что значение 0не только ноль?
cuonglm

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

Спасибо всем за ваши быстрые ответы ... Это действительно полезно для меня. Большое спасибо!
user79658

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.