여러 명령을 실행하고 모든 출력을 집계하여 로그 파일에 삽입하는 스크립트가 있습니다. 실행되는 명령 중 하나는 "netstat -anp"입니다. 이 파일을 검색하여 특정 IP에 대한 모든 명령 실행 및 필터를 찾을 수 있기를 원합니다. sed나 awk를 사용하여 이를 달성할 수 있습니까? 그렇다면 명령은 어떤 모습일까요?
답변1
파일에서 데이터를 필터링하려면 grep을 사용하는 것이 가장 좋습니다. 예를 들어:
grep <search string> <filename>
awk를 사용하면 다음과 같은 것을 사용할 수 있습니다.
awk '/string/ {command}' <filename>
사용할 수 있는 IP를 계산하려면
uniq -c <filename>
이것은 카운트와 함께 고유 IP를 제공합니다
답변2
"wrapped"는 모든 개행 문자가 제거되고 따라서 각 명령의 출력이 한 줄로 "wrapped"된다는 것을 의미한다고 생각합니다. 그렇다면 grep ... | awk ...
작업을 수행하게 되지만 두 명령이 모두 필요하지는 않습니다("하나로 충분할 때 두 개를 사용하지 마십시오"는 일반적으로 좋은 생각입니다). 또한 명령줄에 몇 가지 문제가 있습니다(예: 입력이 없지만 grep
파일 이름이 주어지면 작동하지 않으며 옵션이 있을 때 사용할 이유가 없음을 awk
의미함 ).grep
wc
grep
-c
ipaddr=192.168.0.1
grep -c "netstat -anp.*$ipaddr" logfile
편집하다:
최근 의견에 따르면 특정 시간 간격에 IP 주소가 나타나는 횟수를 계산하고 싶다고 합니다. 명령 은 netstat
시간 간격 내에서 여러 번 실행되고 모두 한 줄에 있으므로 간단한 명령으로 uniq -c
는 충분하지 않습니다. 사실, Perl을 사용하지 않고 내 마음에 가장 먼저 떠오르는 것은 다음과 같습니다.
ipaddr=192.168.0.1
grep "netstat -anp.*$ipaddr" logfile |
tr -cs '0-9.' '\012' |
grep -c "$ipaddr"
POSIX 또는 BSD 스타일 명령이라고 가정합니다 tr
. 또한 grep
찾고 있는 IP 주소(출력에 일반적임 netstat
) 외에 다른 IP 주소가 많이 있을 수 있으므로 두 번째 IP 주소가 필요합니다.