할 때
grep index.html /var/log/apache2/other_vhosts_access.log | awk '{print $1 $13}'
기본적으로 공백 구분 기호가 있습니다.
"
및 구분 기호를 모두 사용하는 방법 :
www.example.com:443 1.2.3.4 - - [01/Feb/2021:15:07:35 +0100] "GET /index.html HTTP/1.1" 200 8317 "https://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
awk
예를 들어 ?를 사용하여 IP와 사용자 에이전트를 얻을 수 있습니다.
사용해 awk -F'["]'
도 별 효과는 없을 것 같습니다.
예상되는 구문 분석은 다음과 같아야 합니다.
www.example.com:443
1.2.3.4
-
-
[01/Feb/2021:15:07:35 +0100]
"GET /index.html HTTP/1.1"
200
8317
"https://www.example.com/"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
답변1
역할 클래스에 공백을 포함해야 합니다.
echo 'word1 word2"word2 word4"word5' |
awk -F '[ "]' '{ for (i = 1; i <= NF; ++i) { print $i } }'
답변2
IP 주소와 사용자 에이전트가 필요합니다.
IP 주소는 공백으로 구분된 두 번째 단어입니다. 기본값으로 존재합니다 $2
.awk
FS
사용자 에이전트는 문자열의 마지막 큰따옴표 부분 문자열입니다. 마지막 큰따옴표를 제거한 다음 마지막 큰따옴표까지 모든 항목을 제거하면 됩니다.
그리고 awk
:
awk '{ ip = $2; sub("\"$",""); sub(".*\"",""); ua = $0; print ip; print ua }'
아니면 조금 더 짧게,
awk '{ ip = $2; sub("\"$",""); sub(".*\"",""); print ip; print }'
그리고 sed
:
sed -e 'h' -e 's/[^ ]* //;s/ .*//p' \
-e 'g' -e 's/"$//;s/.*"//'
먼저 예약된 공간( h
)에 행을 저장한 다음 (현재) 첫 번째 공간까지 삭제하여 IP 번호를 추출합니다. 이렇게 하면 인쇄된 IP 번호가 격리됩니다. 그런 다음 저장된 줄( g
)을 검색하고 코드에서와 동일한 프로세스를 적용합니다 awk
. 즉, 마지막 큰따옴표를 제거한 다음 (현재) 마지막 큰따옴표까지 모든 것을 제거합니다.
두 명령 모두 한 줄에 IP 번호를 인쇄하고 다음 줄에 사용자 에이전트 문자열을 인쇄합니다.