2

問題は次のとおりです。サーバーに到着するすべてのマルウェアパケットのタイムスタンプとIPアドレスが登録されているさまざまなtxtファイルがあります。私がやりたいのは、マルウェアパケットが最初に到着したときに、すべてのIPについて表示する別のtxtファイルを作成することです。

一般的に私はこのようなことをしたいです:

for every  line in file.txt
 if (ip is not present in list.txt)
 copy timestamp and ip in list.txt

私はそれを行うためにawkを使用しています。主な問題は「ipがlist.txtに存在しない場合」です。私はこれをやっています:

 {    a=$( grep -w "$3" list.txt | wc -c );
    if ( a == 0 )
   {
     #copy timestamp and ip in list.txt
   }

(IPアドレスがソースファイルの3番目の列にあるため、$ 3を使用しています)

awkにgrep関数を評価させる方法がわかりません。バックティックも試してみましたが、うまくいきませんでした。誰かが私にいくつかのヒントを与えることができますか?

次のようなテストファイルでスクリプトをテストしています。

10  192.168.1.1
11  192.168.1.2
12  192.165.2.4
13  122.11.22.11    
13  192.168.1.1
13  192.168.1.2
13  122.11.22.11
14  122.11.22.11
15  122.11.22.11
15  122.11.22.144
15  122.11.2.11
15  122.11.22.111

取得する必要があるものは次のとおりです。

10  192.168.1.1
11  192.168.1.2
12  192.165.2.4
13  122.11.22.11    
15  122.11.22.144
15  122.11.2.11
15  122.11.22.111

あなたの助けのおかげで、私は私のニーズに合ったスクリプトを作成することに成功しました:

awk '
FILENAME == ARGV[1] {
    ip[$2] = 1
    next
}
! ($2 in ip) {
    print $1, $2 >> ARGV[1]
    ip[$2] = 1
}
' list.txt file.txt 
4

4 に答える 4

3

質問を「awk内からコマンドのステータスを評価するにはどうすればよいですか?」と解釈し、システムを使用するだけです。

{{
  if(system( "cmd")== 0){
    #コマンドは成功しました
  {{
}

したがって、あなたの場合は、次のようにしてください。

{{
  if(system( "grep -w \" "$ 3" \ "list.txt> / dev / null")== 0){
    ..。
  }
}

ただし、問題へのアプローチを再検討することをお勧めします。毎回のグレッピングは計算コストが高く、問題に取り組むためのより良い方法があります。(たとえば、list.txtを1回配列に読み込みます。)

また、wcを使用する必要がないことに注意してください。文字列と一致しない場合、grepは失敗します。出力を解析するのではなく、戻り値を使用します。

于 2011-10-12T15:02:19.060 に答える
2

これにより、実行結果が変数aに保存されます。

BEGIN {  } 
{
"grep -w \"$3\" list.txt | wc -c" | getline a
print a
}
END   {}
于 2011-10-12T15:04:27.843 に答える
1

getlineを使用したい:

BEGIN {
    "date" | getline current_time
     close("date")
     print "Report printed on " current_time
}

これはの出力を受け取り、dateそれをcurrent_time変数に入れます。grepでも同じことができるはずです| wc-l。

于 2011-10-12T14:42:27.780 に答える
1

しかし、実際にやりたいのは、awkに最初にlist.txtファイルを読み取らせてから、メモリ内のlist.txtデータを使用して他のファイルを処理することです。system()これにより、各回線の呼び出しを回避できます。

ipはlist.txtの最初の列にあると思います。

あなたが言うときcopy timestamp and ip in list.txt、私はあなたがfile.txtの現在の行からlist.txtファイルにいくつかの情報を追加したいと思います。

awk '
    FILENAME == ARGV[1] {
        ip[$1] = 1
        next
    }
    ! ($3 in ip) {
        print $3, $(whatevever_column_holds_timestamp) >> ARGV[1]
    }
' list.txt file.txt

質問の更新のサンプルファイルと簡略化された要件を考えると、次のようになります。

awk '! seen[$2]++' filename

あなたが見た結果を生成します。IPがまだ表示されていない場合、そのawkプログラムはその行を出力します。

于 2011-10-12T16:06:23.577 に答える