큰 따옴표 사이의 값 추출


16

내 쿼리는 큰 따옴표 사이의 값을 추출하는 것 ""입니다. 샘플 입력은 다음과 같습니다.

10.219.41.68---[11 / Jun / 2014 : 10 : 23 : 04 -0400] Sec : 0 MicSec : 1797 "GET / balancer-manager 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는 null입니다?
cuonglm

그런 다음 인쇄하지 않습니까? 당신의 대답에서와 동일합니다. 차이점은 귀하의 답변이 $ 2가없는 모든 기록에 빈 줄을 인쇄한다는 것입니다.

아니요, 대답은 공란처럼 인쇄됩니다. 그리고 그 값이 0null 일뿐 만 아니라
cuonglm

나는 문제가되지 않는 질문의 맥락을 생각해 보았습니다.

빠른 답변에 감사드립니다 ... 나에게 정말 도움이됩니다. 고마워요!
user79658

4

이후 awkperl솔루션을 이미 제공, 내가 원했고 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.