[英]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.