열 2에 다른 포트 번호가 있는 액세스 로그 파일이 있습니다. 짝수 번호의 포트를 통과한 모든 트래픽을 나열하고 싶습니다. 내가 어떻게 해?
답변1
전문가는 없지만 awk
모듈러스 연산자를 사용하는 간단한 예는 다음과 같습니다.
echo "foo bar 2
bar foo 3
foobar barfoo 4" | awk '($3 %2 == 0)'
foo bar 2
foobar barfoo 4
$3
어디에 있는 줄만심지어인쇄됩니다.
답변2
로그 파일이 아래와 같은 경우:
cat logfile
192.168.1.102 81 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"
192.168.1.102 2323 [15/Aug/2016:10:54:32 +0530] "some message"
그러면 아래 명령을 사용하여 짝수 포트 번호가 있는 로그 메시지의 전체 줄을 인쇄할 수 있습니다.
while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"
다음과 같은 출력이 생성됩니다.
while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"
또는
포트 번호만 인쇄하려면 다음과 같이 할 수 있습니다.
for i in `cat logfile | awk '{ print $2 }'`; do if [ $(($i % 2)) -eq 0 ]; then echo "Port number: $i"; fi ; done
Port number: 8888
Port number: 80
메모:나는 당신의 로그 파일에 빈 줄이 없다고 가정합니다.
답변3
사용하는 파일 형식(구분자 공백, 쉼표, 파이프 등)에 따라 다음을 수행합니다.
cat <filename> | awk -F"<delimiter>" '{if ($<column number> %2 == 0){print $0}}'
아래와 같이 제가 만든 샘플 파일은 다음과 같습니다.
/ : server1> cat test1
a 2
b 1
c 5
d 6
e 9
f 8
원하는 출력을 얻기 위해 아래와 같이 쿼리를 수행합니다.
/ : server1> cat test1 | awk -F" " '{if ($2 %2 == 0){print $0}}'
a 2
d 6
f 8