테스트 파일:
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
해당 라인의 마지막에서 두 번째 필드를 인쇄하고 다음 라인을 읽습니다. 다음 줄부터 두 번째 필드를 출력합니다.