簡體   English   中英

awk +過濾日志文件

[英]awk + filter Log files

我使用以下好的awk命令來過濾重復的行

例:

cat LogFile | awk '!seen[$0]++'

問題是,在某些情況下,我們需要過濾重復的行,盡管有些字段不同,但它們並不那么重要

例如

日志文件:

 [INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08
 [INFO],[02/Jun/2014-19:31:25],EXE,ds1a,INHT VERION , 1.4.4.3-08
 [INFO],[02/Jun/2014-19:32:40],EXE,ds1a,INHT VERION , 1.4.4.3-08

請看一下這個文件 - LogFile

我需要從第三個分隔符“ ”中刪除重復的行直到該行的結尾,

而且無論在第三個分隔符之前是什么

所以最后我應該得到這個過濾文件:(應該總是得到列表中的第一個)

    [INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

所以請幫我完成我的任務

如何從第三個分隔符“ ”過濾LofFile,並忽略字段: [INFO],[...........],EXE,

備注 - 植入也可以使用perl one liner line

使用GNU awk for gensub():

$ awk '!seen[gensub(/([^,]*,){3}/,"","")]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

任何支持RE間隔的awk(大多數現代awks):

$ awk '{key=$0; sub(/([^,]*,){3}/,"",key)} !seen[key]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

使用perl單線程:

perl -lne '$k = s/(.*?,){3}//r; print if !$seen{$k}++' file.log

輸出:

[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

說明:

開關

  • -l :啟用行結束處理。 僅當最后一行日志文件缺少新行時才需要
  • -n :為輸入文件中的每一行創建一個while(<>){..}循環。
  • -e :告訴perl在命令行上執行代碼。

代碼

  • $k = s/(.*?,){3}//r :將第三個逗號后的所有內容保存在變量$k
  • print if !$seen{$k}++ :如果之前沒有看到該鍵,則打印該行。

使用autosplit的方式略有不同:

perl -aF, -ne'print unless $seen{"@F[3..$#F]"}++' logfile.txt

你可以有:

awk 'BEGIN{FS=OFS=","}{o=$0;$1=$2=$3=""}!seen[$0]++{print o;}' ...

暫無
暫無

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

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