0

ログと呼ばれるこのような行でいっぱいのファイルがあります

19:56:52 12 Nov;Warning;em0;eth0;222.171.89.16;49.137.111.136;ICMP;;
08:35:51 00 Aug;That's odd;em0;eth0;142.53.155.238;252.1.134.24;ICMP;;
11:47:48 21 Jun;Look into this ;em1;eth0;50.219.1.59;56.95.45.60;UDP;16351;15354

awk を使用して、探しているアドレスを含む行を見つけて再配置したいと考えています。

私の試みは

awk '/222.171.89.16/ {print $2,$3,$6,$4,$5,$1}' logs

文字列を区切る方法をawkに伝える必要があると思うので、FSを使用してみました

awk '/222.171.89.16/ {FS = ";"}; {print $2,$3,$6,$4,$5,$1}' logs

ただし、これは一部の行でのみ機能します。また、最初に言いたいのは、IP アドレスが 5 列目からのものであればアウトバウンドであり、6 列目からのものであればインバウンドであるということです。したがって、データはこの順序である必要があります。私もしなければならないテーブルを許してください。

TYPE | IFACE   | OFACE   | PROT | SPORT | DPORT |            DATE |
|------+---------+---------+------+-------+-------+-----------------|
| OUT  | em0     | eth0    | ICMP |     0 |     0 | 08:35:51 00 Aug |
| OUT  |         | virbr0  | TCP  | 24760 | 26014 | 07:08:48 18 Feb |
| IN   | em2     |         | ICMP |     0 |     0 | 21:54:43 06 Aug |
| OUT  | virbr0  |         | UDP  | 29450 |  2501 | 00:46:27 04 Aug |
| IN   | virbr0  | eth1    | ICMP |     0 |     0 | 06:29:02 20 Sep |
| IN   | em0     | em0     | ICMP |     0 |     0 | 15:41:37 09 Nov |
| OUT  | eth0    | virbr0  | UDP  | 21879 |  3645 | 13:43:33 11 Nov |
| IN   | em1     | em1     | UDP  |  7699 | 18698 | 06:06:15 12 Oct |
| OUT  | em1     | em0     | ICMP |     0 |     0 | 14:11:09 25 Aug |
| IN   | em2     | em0     | UDP  | 24814 | 31182 | 17:45:57 00 Dec |
| OUT  | eth1    | em1     | UDP  |  4915 | 18665 | 01:49:46 15 Oct |
---------------------------------------------------------------------
4

2 に答える 2

1

FSの設定は正しいです(デフォルトはスペース文字ですが、「;」が必要です)

IP アドレスを探している場合は、正規表現でドットをマスクする必要があります。

/222\.171\.89\.16/ .....

フィールド位置を区別したい場合は、(正規表現の代わりに)書くことができます

 $5=="222.171.89.16"  { print ....}

アウトバウンドの基準に一致する

于 2013-08-09T06:12:31.133 に答える
1

通常、FS は -F スイッチまたは BEGIN 句で定義します (以下で説明したように)。私の sample.awk は完全な出力を生成しませんが、出発点として使用できると思います。

$ awk -v IP=222.171.89.16 -f sample.awk yourfile 
|OUT  |em0  |eth0 |19:56:52 12 Nov|

$ cat sample.awk 
BEGIN {
    FS = ";"    # Field separator

    fmt = "|%-5s|%-5s|%-5s|%-15s|\n"    # Output format

    if (! IP) { # Check if an IP address has been provided
        print "No IP address given! Exiting." > "/dev/stderr"
        exit 1
    }
}

# Test records and print formatted output
$0 ~ IP {
    TYPE = $5 == IP ? "OUT" : "IN"
    printf fmt, TYPE, $3, $4, $1
}
于 2013-08-09T06:13:07.183 に答える