열 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