파일의 줄 수를 어떻게 계산합니까?

파일의 줄 수를 어떻게 계산합니까?

파일에 서로 다른 IP가 몇 번이나 있는지 계산해야 합니다.

grep그냥 사용할 권한이 없기 때문에 이것을 사용하여 파일을 엽니다.grep

내 권리

User lotarc may run the following commands on herbert:
    (root) /bin/su - censored
    (root) /bin/su - censored
    (root) /bin/cat /var/log/nginx/access.log, /bin/cat /var/log/nginx/access.log.1, /bin/zcat /var/log/nginx/access.log.[0-9]*.gz, /bin/cat /var/log/nginx/error.log, /bin/cat /var/log/nginx/error.log.1, /bin/zcat
        /var/log/nginx/error.log.[0-9]*.gz

sudo cat /var/log/nginx/access.log.1 | grep -E '1ip|2ip|3ip'

내 질문은 이 IP를 계산하고 출력을 얻는 방법입니다. 여러 파일(예: access.log.2.gz)에서 개수를 계산해야 합니다.

문서 내용

some ip - - [30/Sep/2019:07:26:03 +0300] "POST /clientapp/request/signUp HTTP/1.1" 200 0 "-" "python-requests/2.22.0" "-"

답변1

이 시도,

cat access_log | awk '{a[$1]++} END {for(i in a) print a[i],i}' | sort -n | tail -n1

특정 IP의 경우:

cat access_log | awk '$1 == "192.168.1.37" || $1 == "192.168.1.110" {a[$1]++} END {for(i in a) print a[i],i}' 

답변2

내가 조금 미쳤을 수도 있지만, 숫자를 세고 싶다면 이 정도로 간단해 보입니다.

 awk '{print $1}' access.log |uniq |wc -l

그러면 단일 파일의 개수가 출력됩니다. 모두 원한다면 모두 zgrep하고 끔찍한 IP 주소 정규식을 사용할 수 있습니다.

zgrep '\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)' access.log.*.gz | awk '{print $1}' | uniq |wc -l

물론 똑똑한 사람들이 더 쉬운 방법을 제공할 수 있을 거라 확신합니다. 하지만 아직은 아직 이르기 때문에 이 솔루션을 제안해 드리고자 합니다. nginx를 실행하는 웹서버에서 테스트되었으며 50개 이상의 로그 파일에서 작동했습니다.

OP에 따르면 zgrep이 없으면 먼저 gzip을 통해 로그 파일을 실행할 수 있습니다.

OP는 다른 메시지에서 이것이 그에게 효과가 있었다고 언급했습니다. 이것은 또한 msp9011 솔루션에서 가져온 것이므로 이를 인정하십시오.

cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |sort -nr

OP는 요청된 라인을 100개 이상 인쇄할 수 있는 솔루션을 기대하고 있습니다. 나는 이것이 awk 문으로 이루어질 수 있다고 생각하지만, 나는 그것을 무차별 방식으로 할 것이다:

  cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |awk '$1>100' | sort -nr

관련 정보