列の値が偶数の場合に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

関連情報