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만 OK심지어인쇄됩니다.

답변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

관련 정보