ピリオドが9個ある行のみを解析する

ピリオドが9個ある行のみを解析する

13.5 テラバイトから抽出した 90 ギガバイトのデータがあります。

sort -u | uniq13.5T の syslog データから awk されたデータを試してみました。

不正なデータがあることは明らかだったので、awk で解析を再実行し、次のように表示されました。

 awk -F, '!seen[$1]++' inputfile > outputfile

これは最も時間効率の良い方法であることが判明しましたが、不正な形式のデータも含まれていました... 不正な形式のログ エントリがあるか、uniq と awk のソートで一部の行が変更になった可能性があります。サンプル サイズが十分に大きいため、元のデータを解析するより優れた方法があるかどうかは気にしません。つまり、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

[^.]*\.ピリオド以外の文字の任意の数に一致し、([^.]*\.){9}ピリオドが続く 0 個以上のピリオド以外の文字のシーケンス 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

関連情報