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
실제로 줄 번호별로 다음과 같습니다.
- 검색 문자열 설정
- 5번 반복하여 일치하는 항목이 여러 개 있는지 확인합니다.
- 199개의 0을 인쇄한 다음 ewline을
"$IP"
인쇄합니다 .\n
- 파이프 출력
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