awkとsedを使って情報を抽出する

awkとsedを使って情報を抽出する

のすぐ隣にある IP を抽出したいです(axyz-pc)。このタスクは、正規表現を使用したコマンドで実行しましたgrep。ただし、awk と sed を使用して抽出する必要があります。 grep -Po '(?<='axyz-pc')[^:]+' logs | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'| sort -nr| uniq -c |sort -nr

ログ:

2017-04-11 15:15:00 SMTP connection from (axyz-pc) [36.32.138.106]:1236 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:01 H=(axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:01 SMTP connection from (axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.106]:4619 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist

出力は次のようになります(重複した IP は繰り返しではありません)。

36.32.138.106
114.225.87.41
36.32.138.216
37.49.224.14

答え1

なぜスタックするのかはわかりませんgrep。さらに詳しく調べる必要があります。ただし、ここでは perlre は必要ありません。次のようなもので十分です (少なくとも、提供されたサンプルでは)。

grep -o 'axyz-pc) \[[^]]*' | grep -o '[^[]*$'

出力:

36.32.138.106
114.225.87.41
114.225.87.41
36.32.138.216
36.32.138.216
37.49.224.14
37.49.224.14
36.32.138.106

次に数値順にソートして適用しますuniq:

sort -t. -k1,1n -k2,2n -k3,3n -k4,4n | uniq

出力:

36.32.138.106                                                             
36.32.138.216
37.49.224.14
114.225.87.41

答え2

を使用する必要がある場合sed、IP が最初の括弧内にあると仮定します。

sed -n '/axyz-pc/s/[^[]*\[\([0-9.]*\).*/\1/p' x|sort -nr| uniq

答え3

awk を使用し、フィールドが]orで区切られ[、2 番目のフィールドだけが必要であることを伝えます。

awk -F'[][]'  '
     {uniqoccurences[$2]++;}
 END { for (i in uniqoccurences) {
            print i ":" uniqoccurences[i] 
        } 
     } '

上記の例では、各「$2」の出現回数を示す「:n」も出力していますが、これを行う必要はありません(その場合は、セクションprint i内のループ内で実行するだけですEND)。

正規表現:は、正規表現が文字クラス内でと を[][]扱う方法を使用しています(の直後の は検索する文字として扱われ、最初の の後(および閉じる の前) の も検索する文字として扱われます。したがって、または を検索します)。][[...]][[[][][]][

別の方法:

awk -F'[][]'  '{ print $2 }' | sort | uniq

答え4

cat in.txt | awk '/SMTP/{print $7}'  

これを私に与えます。

[36.32.138.106]:1236
[114.225.87.41]:3823
[36.32.138.216]:1984
[37.49.224.14]:51593

最後のステップ:

cat in.txt | awk '/SMTP/{print $7}' | sed -e 's/\[//; s/\]//; s/:...//' 

編集: 上記の $7 は、2 種類の行の IP アドレスのフィールド オフセットが異なるため機能しません。より良い方法は次のとおりです。

cat in.txt | awk -F "axyz-pc\) \[" '{print $2}' | awk -F"\]" '{print $1}'

最初の awk でフィールド区切り文字として「axyz-pc」を使用し、出力を 2 番目の awk にパイプします。

代わりに sed を使用すると、複雑にはなりません。

関連情報