0

不審なアクティビティを探して、テキスト ファイルをふるいにかけたいと考えています。私は、grep、sed、awk などの bash スクリプトに少し慣れています。stackoverflow.com や tldp.org などで調査したり、同僚と話をしたりした結果、私の仕事には perl と python が最適であることがわかりましたが、これらのスクリプト言語の経験はまったくありません。

さまざまなスクリプト言語、コンパイル済み言語、またはインタープリター言語による入力を歓迎します。私の制限により、コードにコメントを追加して、言語をすばやく理解し、学習できるようにしてください。

わかりました、タスクは列に並べ替えられたアイテムの並べ替えとカウントです。これの一部は、grep、awk、および sed を使用して/できる/達成できます。残念ながら、再帰的な側面 (私が問題を認識しているため) には困惑しています。

入力テキストは、IP アドレスの 2 つの列 (以下の例では単純化されています) と宛先ポートの列 (可能なすべての値) でソートされます。このファイルのサイズは数メガバイトになる場合がありますが、一度に 250MB を超えることはないので、絶対的な効率は必要ありません。シンプルさは。

SIP        DIP        DPt
111.100    200.150    80
111.100    200.150    443
111.100    200.155    22
111.100    200.155    80
111.100    200.155    443
111.100    200.160    80
111.100    200.165    139
111.100    200.165    443
111.100    200.165    512
115.102    225.150    80
115.102    225.150    137
115.102    225.150    443
120.125    250.175    23
120.135    250.145    23
125.155    250.165    80
125.155    250.165    139
125.155    250.175    1023

私が作業しているコード(メモリからこれを下書きしています...現在私のLinuxボックスにはありません)はこれに似ています...

#!/bin/bash

declare -i counter=0
SIP=null       # current source ip.
SIP_last=null  # for last ip address processed.
SIP_next=null  # not found a use for this, yet. 
               # sorting usually reqs three vars, so here it is.

for SIP in `zcat textfile.gz | awk '{ if ($3 <1024) print $1,$2,$3}'` do
# Ensure I count the first item.  This was problematic at first.
if [[ "$SIP_last" == null ]] then
SIP_last=$SIP
counter=counter+1  # counter=+ didn't work reliably.

# Do something useful.  As shown, it works.
if [[ "$SIP" == "$SIP_last" ]] then
counter=counter+1

if [[ "$SIP != "$SIP_last" ]] then
echo SIP: $SIP_last     Counter: $counter   # DIP code has not yet been added.
SIP_last=$SIP

# Ensure I always catch the last item.  Still working on this issue.
# XXX

done

上記の入力を使用すると、出力は次のようになります...

SIP      DIP Ct   Ports
         > 2      < 1024
111.100  200.150  80, 443
111.100  200.155  20, 80, 443
111.100  200.165  139, 443, 512
115.102  225.150  80, 137, 443

出力を見ると、問題の核心は DIP カウント > 2 およびポート < 1024 のみを報告していることがわかります。提供された awk ステートメントを使用すると、ポートを < 1024 に制限するのは簡単です。DIP を SIP に一致させ、キッカーである DPt の実行中の集計を維持しています。

繰り返しますが、これはメモリからのものであるため、コーディング エラーを許してください。ご協力ありがとうございます。

アレン。

4

1 に答える 1

1

投稿したサンプル入力ファイルを使用して:

$ awk '
NR==1 { print; next }
$3 < 1024 {
   key = $1 "\t" $2
   if (!seen[key,$3]++) {
      cnt[key]++
      vals[key] = vals[key] sep[key] $3
      sep[key] = ", "
   }
}
END { for (key in cnt) if (cnt[key] > 1) print key "\t" vals[key] }
' file
SIP        DIP        DPt
111.100 200.155 22, 80, 443
111.100 200.165 139, 443, 512
125.155 250.165 80, 139
115.102 225.150 80, 137, 443
111.100 200.150 80, 443

それがあなたが探しているものでない場合は、明確にしてください。

于 2013-02-26T02:20:04.223 に答える