列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