패턴 일치 전/후의 총 라인 수 계산

패턴 일치 전/후의 총 라인 수 계산

IP 주소 목록이 길지만 순서가 맞지 않습니다. 특정 IP 주소 앞/뒤에 몇 개의 IP 주소가 나오는지 확인해야 합니다. 이 목표를 어떻게 달성할 수 있나요?

답변1

일치 항목을 포함하여 일치 항목 전후의 줄 수(예: 일치 항목을 제외하려면 결과에서 1을 빼야 함):

sed -n '0,/pattern/p' file | wc -l
sed -n '/pattern/,$p' file | wc -l

그러나 이것은 IP 주소와는 아무런 관련이 없습니다.

답변2

아마도 가장 간단한 것은,

sed -n '/pattern/{=; q;}' file

오류를 지적해주신 @JoshepR에게 감사드립니다.

답변3

나는 이 두 가지 방법을 수행했지만 이것이 가장 좋다고 생각합니다.

: $(( afterl=( lastl=$(wc -l <~/file) ) - 2 -
  $(( beforel=( matchl=$(sed -n "/$IP/{=;q;}" <~/file) ) - 1
)) ))
for n in last match afters befores
do  printf '%s line%s :\t%d\n' \
        "${n%s}" "${n##*[!s]}" $((${n%s}l))
done

이는 이들 모두를 현재 쉘 변수로 저장한 다음 출력을 위해 for 루프에서 평가합니다. 파일의 총 줄 수를 계산 wc하고 일치하는 첫 번째 줄 번호를 가져옵니다 sed.

출력:

last line :     1000
match line :    200
after lines :   799
before lines :  199

나도 그랬다:

sed -n "/$IP/=;\$=" ~/file |  
tr \\n \  | { 
IFS=' ' read ml ll 
printf '%s line%s:\t%d\n' \
    last '' $((ll=${ll##* }))
    match '' $ml \
    after s "$((al=ll-ml-1)) \ 
    before s $((bl=ml-1))
}

sed일치하는 줄 번호와 마지막 줄 번호만 인쇄한 다음 tr중간 \n줄을 다음으로 변환합니다., read첫 번째 결과를 sed읽고 $ml다른 모든 결과를 $ll. $ll나중에 다시 설정할 때 확장의 마지막 결과를 제외한 모든 결과를 제거하여 가능한 여러 일치 사례를 처리할 수 있습니다.

출력:

last line :     1000
match line :    200
after lines :   799
before lines :  199

두 방법 모두 다음과 같이 생성된 파일에서 테스트되었습니다.

IP='some string for which I seek' 
for count in 1 2 3 4 5 
do  printf '%.199d%s\n' 0 "$IP" 
done | tr 0 \\n >~/file 

실제로 줄 번호별로 다음과 같습니다.

  1. 검색 문자열 설정
  2. 5번 반복하여 일치하는 항목이 여러 개 있는지 확인합니다.
  3. 199개의 0을 인쇄한 다음 ewline을 "$IP"인쇄합니다 .\n
  4. 파이프 출력 tr- 0을 ewline으로 변환 \n한 다음~/file

답변4

awk마지막 일치 전후의 줄 수를 보고하는 솔루션

awk '/192\.168\.1\.1/{x=NR};{y=NR} END{printf "before-%d, after-%d\n" , x-1, y-x}'  file

관련 정보