열 값에 짝수가 있는 경우 awk를 사용하여 인쇄하는 방법

열 값에 짝수가 있는 경우 awk를 사용하여 인쇄하는 방법

열 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

관련 정보