13.5TBから90GBのデータを抽出した。
sort -u | uniq
13.5Tのsyslogデータでawk処理データを試しました。
いくつかの間違ったデータが明らかになったので、次のようにawkと「seen」を使用して解析を再実行しました。
awk -F, '!seen[$1]++' inputfile > outputfile
これは最も効率的な方法であることが判明しましたが、いくつかの誤ったデータも含まれていました。不正なログエントリがあったか、または uniq'ing と awk'ing を並べ替える際に、一部の行が破損している可能性があります。私はサンプルサイズが十分に大きいので、生データを解析するより多くの/より良い方法があるかどうかは関係ありません。これは、13.5Tのわずかな損失が大丈夫であることを意味します。
各アクティブ回線には3つのIPアドレスがあります。
IPアドレスにピリオドが3つあるため、9つの「.」を含む行のみを解析できることが必要です。
答え1
これをテストファイルとして試してみましょう。
$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
1.2.3.4 5.6.7.8 9.10.11 Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period
grepを使う
正確に9つのピリオドを含む行を選択するには、次の手順を実行します。
$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
[^.]*\.
ピリオド以外の文字に続く a が続くランダムな数と一致します。([^.]*\.){9}
ピリオドが続くゼロ個以上の非フィニッシュ文字で構成される正確に9個のシーケンスと一致します。^
行の先頭から一致を開始するには正規表現が必要です。つまり[^.]*$
、9 つのシーケンスの終わりと行の終わりの間にはピリオドではない文字のみ許可されます。
sedを使う
$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
この-n
オプションは、私たちが明示的に要求しない限り、sedが印刷しないように指示します。次のp
正規表現は、sedに正規表現に一致する行を印刷するように明示的に要求します。
awkを使う
$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
または、awkの機能を使用してフィールドを区切る文字を定義することもできます(ヒント:ジェフ・シャラー):
$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep