awk에서 공백과 따옴표를 구분 기호로 사용하세요.

awk에서 공백과 따옴표를 구분 기호로 사용하세요.

할 때

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.awkFS

사용자 에이전트는 문자열의 마지막 큰따옴표 부분 문자열입니다. 마지막 큰따옴표를 제거한 다음 마지막 큰따옴표까지 모든 항목을 제거하면 됩니다.

그리고 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 번호를 인쇄하고 다음 줄에 사용자 에이전트 문자열을 인쇄합니다.

관련 정보