내 쿼리는 큰 따옴표 사이의 값을 추출하는 것 ""
입니다. 샘플 입력은 다음과 같습니다.
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
누구든지 아이디어가 있다면 제안하십시오.
답변
당신은 cut
이것을 위해 사용할 수 있습니다 :
$cut -d '"' -f2 < logfile
GET /balancer-manager HTTP/1.1
-d '"'
cut
큰 따옴표를 필드 구분 기호로 사용하도록 지시 합니다. -f2
첫 번째와 두 번째 따옴표 사이 또는 첫 번째 따옴표로 묶인 문자열 사이에있는 두 번째 필드를 가져 가도록 지시합니다.
답변
사용하는 방법 awk
awk -F'"' '$0=$2' file
어떤 불합리한 이유로 HTTP 메소드가 실제로 0
있고 이들을 출력하려는 경우
awk -F'"' '{$0=$2}1' file
답변
이후 awk
및 perl
솔루션을 이미 제공, 내가 원했고 sed
:
sed 's/[^"]*"\([^"]*\)".*/\1/' file
답변
여러 가지 방법으로 할 수 있습니다.
와 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
답변
인용 된 입력 번호 처리
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