我有一個訪問日誌文件,其第 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