取得日誌中第一次出現的群組

取得日誌中第一次出現的群組

我有一個巨大的日誌,我打算僅過濾每個組的第一次出現。在日誌中,「群組」是第一列中時間戳之後的所有內容。

看一個例子:

Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:03.314;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:03.525;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:05.241;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.546;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:07.569;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.120;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.371;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:09.822;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;

預期結果是:

Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

我能夠得到沒有時間戳記的獨特組合:

cut -d";" -f2- small_log.log | sort | uniq

但我如何將其連接回來以獲得時間戳呢?我也不認為這sort | uniq能很好地擴展到數百萬行。

答案1

我會在 awk 中這樣做:

$ awk -F';' '++seen[$2$3$4]==1' file 
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

當某項計算結果為 true 時的預設操作awk是列印目前行。此表達式++seen[$1$2}使第二個和第三個欄位成為關聯數組中的鍵seen,並將其值加一。因此,++seen[$2$3$4]==1僅在第一次看到第二場和第三場的組合時才成立。

它基本上是一種簡寫方式:

awk -F';' '{ 
             seen[$2$3$4]++; 
             if(seen[$2$3$4] == 1){
                print
             }
            }' file 

或者,您也可以像您嘗試的那樣使用sort.您甚至不需要cut,只需告訴sort對欄位 2 到 4 進行排序並傳回唯一的結果:

$ sort -t';' -k2,4 -u file 
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;

如果您需要按時間戳對它們進行排序,只需sort再次通過管道:

$ sort -t';' -k2,4 -u file  | sort
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

相關內容