簡體   English   中英

合並重疊的日志文件

[英]consolidating overlapping log files

我有一個非常倉促地刪除日志的應用程序。 由於一次由內部編程人員完成,因此它在日志中保留了大約10,000行,並且它是不可配置的。 新輸入條目,將最底端的條目推出日志。

因此,我有一個cron作業,它每小時都會對日志文件進行快照。 在快速交易時間,日志與前一個日志重疊不到一千行,而在慢速交易時間,則有5-7 000行重疊。

我的目的是將日志重構為一個大日志,其中每行只有一個實例。 我目前獲得這種結果的方法是,遍歷最新日志文件中的每一行,並將其與上一個文件中的所有行進行比較,如果不存在,請將其附加到單個日志文件中。 但是對於5-7K的行來說,這是一個冗長的過程,是否有工具或方法來發現文件的重疊部分,例如:

log1    log2    log3          Resulting File

1111 ........................ 1111
x1x1 ........................ x1x1
2222 ........................ 2222
3333 ........................ 3333
4444 ........................ 4444
5555 ........................ 5555
6666    6666 ................ 6666
7777    7777 ................ 7777
8888    8888 ................ 8888
        9999 ................ 9999
        aaaa ................ aaaa
        bbbb ................ bbbb
        cccc    cccc ........ cccc
        y1y1    y1y1 ........ y1y1
        dddd    dddd ........ dddd
                eeee ........ eeee
                z1z1 ........ z1z1
                ffff ........ ffff
                gggg ........ gggg

編輯:我已經更新了我想要用更好的格式化輸入和結果輸出文件表示形式完成的結果。

更麻煩的是,此日志文件沒有時間戳。 看圖...雖然不是緊要關頭,但很高興知道什么時候發生了什么,但是再次,日志的目的不是計時。 它只是捕獲錯誤及其發生頻率。

因此,我確定這是一個正則表達式問題,但它們並不是我的強項,我也不知道如何捕獲跨越多行的模式,當我說多行時,它是數百行或四倍的行數。

awk 'NR==FNR {print; seen[$0]=1; next} !($0 in seen)' file1 file2 

這將讀取,打印並將行存儲在file1中(“ NR == FNR”條件),然后,對於file2,僅當在file1中未看到行時才打印該行


有了您的更新,可以使其更加通用:

awk '! seen[$0]++' log1 log2 ...

這可能會占用大量內存,具體取決於文件的大小。 它必須存儲所有唯一的行,以及使用關聯數組的所有開銷。

另外,如果單個文件包含重復的行,則僅輸出第一行。

使用uniq的另一種方法

cat file1.txt file2.txt | sort | uniq > bigFile.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM