grep을 사용하여 각 패턴의 첫 번째 발생을 찾으십시오.

grep을 사용하여 각 패턴의 첫 번째 발생을 찾으십시오.

이것:

cat /var/log/apache2/other_vhosts_access.log |grep -m 1 123.123.123.123

첫 번째 IP 123.123.123.123을 알려주세요.

그러나 IP1이 처음 발생하는 방법그리고IP2가 처음으로 나타납니다.그리고IP3가 처음으로 등장그리고...?

이것은 분명히 작동하지 않지만 다음과 같은 아이디어를 제공합니다.

cat /var/log/apache2/other_vhosts_access.log |grep -m 1 123.123.123.123 AND 124.124.124.124 AND 125.125.125.125

답변1

이 작업을 수행하기 위해 awk를 사용하겠습니다(ip가 첫 번째 열이라고 가정).

awk '!seen[$1]++ && $1 ~ /123.123.123.123|124.124.124.124|125.125.125.125/' /var/log/apache2/other_vhosts_access.log

답변2

이것이 grep '123.123.123.123'첫 번째 발생을 제공하지는 않습니다.123.123.123.123 지적 재산권그러나 패턴 123.123.123.123과 일치 123.123.123.123하지만 패턴과 일치하는 as는 단일 문자와 일치하는 정규식 연산자 1234123-123e123입니다 ..

에서만 123\.123\.123\.123일치 123.123.123.123하지만 에서도 일치합니다 23\.123\.123\.1. -F고정 문자열 일치 옵션 도 참조하세요 .grep

여기서는 다음과 같이 합니다.

awk '
  !ips_seen {ip[$0]; n++; next}
  {
    found = 0
    for (i in ip)
      if (index($0, i)) {
        found = 1
        delete ip[i]
        n--
      }
  }
  found
  !n {exit}' ips.txt ips_seen=1 input.txt

여기에는 ips.txt한 줄에 하나씩 IP 주소 목록이 포함됩니다.

한 줄에 여러 개의 IP가 포함되어 있으면 여전히 한 번만 인쇄됩니다.

하위 문자열 찾기만 사용하면 모든 문자를 일치시키는 위의 첫 번째 문제를 index()해결할 수 있지만 .두 번째 문제는 해결할 수 없습니다.

관련 정보