1

行の束を含むログファイルがあり、各束は空白行で区切られています。行の各束から特定の行(共通のパターンを含む)をgrepしたいと思います。行の各束はメールに関するものです。サンプルログファイルは次のとおりです。

#START#
03:48:19:798: : <23/08/2012 03:48:19:019>
03:48:19:798: : <---23/08/2012 03:48 --->
03:48:19:799: : MAIL FROM IP=1.2.3.4
03:48:19:799: : START CHECKING OF IPLIMIT
03:48:19:799: : STOP CHECKING OF IPLIMIT
03:48:20:848:In : MAIL FROM: <a@abc.com>
03:48:20:848: : [A:A:A]
03:48:20:849: : max attach size-->5242880
03:48:20:856: : User Is Authenticated with "a@abc.com and domain abc.com"
03:48:20:856: : Passed
03:48:20:987:In : RCPT TO: <x@xyz.com>
03:48:20:987: : email x@xyz.com
03:48:20:992: : [A:A:A]
03:48:20:999: : passed
03:48:20:999:Inside the Store Mails
03:48:20:999: : BCC feature is not applicable x@xyz.com
03:48:21:000: : BCC feature is not applicable from a@abc.com
03:48:21:000:Inside the Store
03:48:21:132:In : RCPT TO: <y@xyz.com>
03:48:21:132: : email y@xyz.com
03:48:21:133: : [A:A:A]
03:48:21:140: : passed
03:48:21:140:Inside the Store Mails
03:48:21:140: : BCC feature is not applicable y@xyz.com
03:48:21:140: : not authenticated
03:48:21:140:Inside the Store
03:48:21:271: : Data Received
03:50:32:049: : 552 Size Limit Exceeded(5242880)
03:50:32:049: : File Moved in LargeSize Folder....
03:50:32:049: : File Moved in LargeSize Folder....
03:50:32:049: : Connection closed
03:50:32:049: : File Deleted /home/Mail//mailbox/LargeSize/x@xyz.com:24085.444724474357(1345673901000)
03:50:32:051: : File Deleted /home/Mail//mailbox/LargeSize/y@xyz.com:39872.512978520455(1345673901140)
MAIL DATA : : 6815779 Bytes
Total: Conn : 16713 Quit By Host : 5565 Stored : 11134 Loop:0
#END#
W A R N I N G ---------------W A R N I N G

...Waiting for activity on port Total Thread Started & 16732 Stoped 16730
#START#
03:56:20:790: : <23/08/2012 03:56:20:020>
03:56:20:790: : <---23/08/2012 03:56 --->
03:56:20:791: : MAIL FROM IP=2.3.4.5
03:56:20:792: : IP IS FRIEND IN WHITELIST
03:56:20:834:In : MAIL FROM:<y@xyz.com>
03:56:20:834: : [A:A:A]
03:56:20:834: : null
03:56:20:834: : Passed
03:56:20:834:In : RCPT TO: <a@abc.com>
03:56:20:834: : email a@abc.com
03:56:20:835: : Mailing List
03:56:20:835: : [A:A:A]
03:56:20:836: : passed
03:56:20:836: : Proceesing maillist
03:56:20:839: : Data Received
03:56:20:865: : /home/Mail//mailbox/MailingList/a@abc.com:79602.39544573233(1345674380836) Msg Queued For Delivery
03:56:20:865: : Msg forward successfully
03:56:20:865: : /home/Mail//mailbox/MailingList/M14310.39892966699(1345674380837) Msg Queued For Delivery
MAIL DATA : : 27985 Bytes
Total: Conn : 16732 Quit By Host : 5582 Stored : 11135 Loop:0
#END#

...Waiting for activity on port Total Thread Started & 16735 Stoped 16731
#START#
03:56:23:957: : <23/08/2012 03:56:23:023>
03:56:23:957: : <---23/08/2012 03:56 --->
03:56:23:958: : MAIL FROM IP=2.3.4.5
03:56:23:959: : IP IS FRIEND IN WHITELIST
03:56:23:999:In : MAIL FROM: <x@xyz.com>
03:56:23:999: : [A:A:A]
03:56:23:999: : null
03:56:23:999: : Passed
03:56:23:999:In : RCPT TO: <y@xyz.com>
03:56:23:999: : email y@xyz.com
03:56:24:000: : [A:A:A]
03:56:24:007: : passed
03:56:24:008:Inside the Store Mails
03:56:24:009: : BCC feature is not applicable y@xyz.com
03:56:24:009: : not authenticated
03:56:24:009:Inside the Store
03:56:24:009: : Data Received
03:56:24:053: : /home/Mail//mailbox/External/y@xyz.com:50098.70335800691(1345674384009) Msg Queued For Delivery
03:56:24:054: : Msg forward successfully
MAIL DATA : : 28276 Bytes
Total: Conn : 16735 Quit By Host : 5582 Stored : 11136 Loop:0
#END#    

ここで、a @ abc.comは外部メールIDであり、x @ xyz.com、y@xyz.comは内部メールIDです。メールごとに、#START#から#END#までの一連の行が生成されます。

行の各束から、パターンマッチングを実行したいと思います。メールが内部電子メールIDから外部電子メールID(2番目の行)である行の束だけが必要です。

メールが外部の電子メールアドレス/IDから内部の電子メールID(最初の行の束)へ、または内部の電子メールIDから内部の電子メールIDへの一連の行は必要ありません。(3行目)。

そして、メールが内部から外部に向かう一連の行を取得した後、単語FROMとを含む行を抽出したいと思いTOます。

awkの、、、および変数を使用して、1行のレコードを作成するために開始および終了する行の各束を変換しようRSとしましたが、できませんでした。改行をまたはなどの区切り文字で置き換えることができませんでした。また、各リソースレコードで複数のパターンマッチングを実行する方法はわかりません。ORSFSOFS#START#|~

オプションを使用してみ/PATTERN/ましたが、関数を使用してgrepコマンドを実行しsystem()、ドメイン名を確認する行を取得できませんでした。それは私にエラーを与えました:sh: 1: not found。それを突破できませんでした。私はコードを使用しました:

if ($0 ~ /FROM/) { print $0 | system("egrep -i 'FROM|TO'") }

また、次のタイプのコードを使用して各レコードをエクスポートしようとすると、機能しません。

for i in $(cat log_file | awk_file_givin_1_resource_record_at_a_time) ; do pattern_matching_commands ; done

パターンマッチングが一度に1行で機能しているので、機能していませんが、一度に束全体で機能させたいと思っています。

4

2 に答える 2

2

レコード間に常に空白行があり、レコード内に空白行がない場合は、awkの「段落モード」を使用RSします。空の文字列に設定します。

awk -v RS= '
    /^[0-9:]*In : MAIL FROM: <[^<>]*@example\.com>$/ &&
    /^[0-9:]*In : RCPT TO: <[^<>]*@example\.com>$/ { … }
'

#START##END#マーカーを本当に使用する必要がある場合は、データを変数に蓄積していきます。処理を実行し、に達したときに変数をリセットします#END#。必要に応じて、次まで処理を無効にします#START#

BEGIN { in_record = 1; }
/^#START#$/ { in_record = 1; }
!in_record { next; }
/^[0-9:]*In : MAIL FROM: <([^<>]*)>$/ { from = $0; sub(/.*</, "", from); sub(/>.*/, "", from); }
…
/^#END#$/ {
    /* processing goes here */
    from = "";
    in_record = 0;
}
于 2012-08-25T16:02:51.010 に答える
2

次のBASHスクリプトはうまく機能すると思いますが、ログのサイズについてベンチマークする必要があります。

#!/bin/bash

INTERNAL_DOMAINS="${1:-xyz.com|xyz.net}"

declare -i LINES BYTES VALIDS
LINES=0
BYTES=0
VALIDS=0
STATUS=stopped
while read LINE
do
  if [ "$STATUS" = stopped ]
  then  
    if [ "${LINE:0:7}" = "#START#" ] 
    then        
      STATUS=started    
      PARA=""           
    fi          
  else  
    if [ "${LINE:0:5}" = "#END#" ] 
    then        
      if [ $STATUS = valid ] 
      then              
        VALIDS+=1               
        echo "$PARA" | egrep -w "FROM|TO"
        echo -e "$VALIDS matched\t----------------------------------------"
      fi                
      STATUS=stopped    
    elif (echo "$LINE" | fgrep -q "RCPT TO") && (echo "$LINE" | egrep -qiv "@($INTERNAL_DOMAINS)")
    then        
      STATUS=valid      
      PARA+="$LINE      
"
    else        
      PARA+="$LINE      
"
    fi          
  fi

  LINES+=1
  BYTES+=${#LINE}
  BYTES+=1
  echo -en "\rRead: lines: $LINES | kB: $(($BYTES/1024)) | matches: $VALIDS " >&2
done

上記のスクリプトを実行可能ファイルとして設定し、次のように実行して進行状況を出力する必要があります。

time ./filter.sh "one.int.com|two.int.com" < sample.log > report.out
于 2012-08-26T11:22:45.690 に答える