13.5 テラバイトから抽出した 90 ギガバイトのデータがあります。
sort -u | uniq
13.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