이 sed 명령이 원하는 출력을 얻지 못하는 이유는 무엇입니까?

이 sed 명령이 원하는 출력을 얻지 못하는 이유는 무엇입니까?

테스트 파일:

872iirji -- RANDOM STUFF -- skjkfj45j
GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1.
Host: my.website.com.
connection: blah blah blah
skjfkjfj

원하는 출력:

_ajax_htmlview?action=28&__and_so_on
my.website.com

sed 역참조를 사용하여 참여하겠습니다.http://my.website.com/_ajax_htmlview?action=28&__and_so_on

sed -n 's=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
        h
        /^Host/{
        s=.*:[ \t]*\(.*\).=\1=
        H
        x
        p
}'

하지만 나는 그것을 이해합니다:

Host: my.website.com
my.website.com

편집하다: 다음과 같이 추가하면 /^GET/{ }작동하는 것 같은데, 이것은 어떻게 작동하고 이전 것은 작동하지 않습니까?

sed -n '/^GET/{
        s=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
        h
        }
        /^Host/{
        s=.*:[ \t]*\(.*\).=\1=
        H
        x
        p
}' testfile

답변1

좋아, 그냥 재미로 필수 awk 솔루션입니다...

나는 또한 작동하는 이 bash oneliner를 연구했습니다.

buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; }

그러면 쉘에 다음과 같이 호출할 수 있는 bash 함수가 생성됩니다.

$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on

그러나 주의할 점이 있습니다. 이는 파일에 "Host" 및 "GET" 인스턴스가 하나만 있는 경우에만 작동합니다.

답변2

사용이 더 쉬워졌습니다 awk:

$ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile
/_ajax_htmlview?action=28&__and_so_on
my.website.com.

코드 awk는 문자열도 포함하는 GET 요청 라인을 찾은 후 ajax해당 라인의 마지막에서 두 번째 필드를 인쇄하고 다음 라인을 읽습니다. 다음 줄부터 두 번째 필드를 출력합니다.

관련 정보