9つのピリオドを持つ行のみの解析

9つのピリオドを持つ行のみの解析

13.5TBから90GBのデータを抽出した。

sort -u | uniq13.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

関連情報