2012-04-19 56 views
0

我有一個日誌文件(file.log),在文件中有多次出現的id,即82244956grep唯一的事件

gzip -cd /opt/log.gz | grep "JBOSS1-1" >> ~/file.log 

實施例::

2012-04-10 09:01:18,196 LOG (7ysdhsdjfhsdhjkwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956 
2012-04-10 09:02:18,196 LOG (24343sdjjkidgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956 
2012-04-10 09:03:18,196 LOG (6744443jfhsdgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957 
2012-04-10 09:04:18,196 LOG (7ysdhsd5677dgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957 

同樣,我們具有10000行具有不同ID(但每個ID重複2-3次實施例的頂部和底部兩行中 file.log已使用命令創建這個例子分別以id 82244956和82244957重複)。我們需要根據唯一ID的結果集(從匹配的IDS任何行),即:

2012-04-10 09:01:18,196 LOG (7ysdhsdjfhsdhjkwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956 
2012-04-10 09:03:18,196 LOG (6744443jfhsdgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957 

我試圖awk程序在Linux,但沒有一次成功的:

awk ' { arr[$1]=$0 } END { for (key in arr) { print arr[key] } } ' file.log >> final-report.log 

或者更好的辦法會要創建具有不同ID的file.log

請指教我該如何修改它?

+0

是否排序順序有關係嗎?如果沒有,你可以管你的文件通過'sort',然後再通過'uniq'給你獨特的線條。你需要傳遞一些參數來指定哪些領域你想他們整理等 – 2012-04-19 06:54:56

回答

3

$1是第一個字段,日期。 id是最後一個字段,$NFawk的說法。所以:

awk '{arr[$NF] = $0} END { for (key in arr) { print arr[key] } }' file.log >> final-report.log 

這使用給定的鍵保持最後一條記錄。要保留第一條記錄,您必須在腳本的主要處理部分中執行條件賦值。

+0

爲我工作:) – ErAB 2012-04-19 07:28:40

1
awk '!_[$NF]++' file.log >> final-report.log 
0

您可以通過運行以下腳本來獲得結果。要保留第一條記錄,您應該在腳本的主要處理部分進行條件判斷。

awk -F"\t" '{delete arr;split($0,arr,"id:"); id_num=arr[2]; 
      if(!(id_num in dic)){line[id_num]=$0;dic[id_num];}} 
      END{for(i in line)print line[i] }' file.log > result.log