IP 주소 목록이 길고 순서가 맞지 않습니다. 특정 IP 주소 전후에 몇 개의 IP 주소가 있는지 찾아야합니다. 어떻게하면 되나요?
IP 주소 목록이 길고 순서가 맞지 않습니다. 특정 IP 주소 전후에 몇 개의 IP 주소가 있는지 찾아야합니다. 어떻게하면 되나요?
답변:
아마도 가장 쉬운 방법은
sed -n '/pattern/{=; q;}' file
오류를 지적 해 주셔서 감사합니다 @JoshepR
dc
것입니다. 아마 이것을 직접 직접 파이프 할 것입니다.
나는 이것을 가장 좋아한다고 생각하지만이 두 가지 방법을 사용했습니다.
: $(( 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
행 번호로 수행합니다.
"$IP"
다음 \n
ewline 을 인쇄합니다.tr
을 \n
ewlines로 변환 한 다음~/file
이를 수행하는 약간의 Perl 코드가 있습니다.
perl -ne '
if(1 .. /192\.168\.1\.1/) { $before++ }
else { $after++ }
$before--; # The matching line was counted
END{print "Before: $before, After: $after\n"}' your_file
IP가 포함 된 줄 전후의 총 줄 수를 계산합니다 192.168.1.1
. 원하는 IP로 교체하십시오.
배쉬 만 사용하면 :
before=0
match=0
after=0
while read line;do
if [ "$line" = 192.168.1.1 ];then
match=1
elif [ $match -eq 0 ];then
before=$(($before+1))
else
after=$(($after + 1))
fi
done < your_file
printf "Before: %d, After: %d\n" "$before" "$after"
$.
카운터 대신에 왜 사용 하지 않습니까?
$after
하는 것보다 더 읽기 쉽다고 생각 합니다 $. - $before
.
$. - 1
에 저장 $.
하십시오 $tmp
. 인쇄를 종료 $. - $tmp
합니다. 따라서 우리는 전후에 카운터가 필요하지 않습니다. 물론 그것은 당신보다 읽기 어렵습니다.
Grep
특정 패턴이 발견 된 횟수를 계산할 수있는 기능이 있습니다. -c
명령을 사용하면 그렇게됩니다. -c
and -v
명령을 사용하면 특정 패턴과 일치하지 않는 횟수를 계산합니다.
예:
grep -c -v <pattern> file
따라서 다음과 같은 것을 시도하면
grep -c -v 192.168.x.x file.log
작동해야합니다.