2013-02-15 44 views
1

我有一個日誌文件,其中包含以下日誌語句如何在比較兩條相似的行時找到差異

例如,

Before starting transaction id = <unique number> 
After starting transaction id = <unique number> 

.... 

Before starting transaction id = <unique number> 
After starting transaction id = <unique number> 

當我在「之前」做一個簡單的grep,我看到400條語句,但 當我爲「後」做一個簡單的grep,我看到402頁的聲明。

如何找到這些語句不成對出現。

+1

'差異「\'貓文件| grep的\後'」「\'貓文件| grep的前\'''? 現在沒有接近bash,所以我沒有測試它。 – Viehzeug 2013-02-15 09:33:21

+0

是After之後的下一行嗎?如果他們配對 – Kent 2013-02-15 09:34:11

回答

2

如果之前配對之後應該有相同的unique number

awk -F= '{a[$2]++;}END{for(i in a)if(a[i]!=2)print "id:"i}' file 

將打印這些不成對的ID。

例如爲:

kent$ cat file 
Before starting transaction id = 1 
After starting transaction id = 1 
Before starting transaction id = 2 
After starting transaction id = 2 
Before starting transaction id = 3 
Before starting transaction id = 4 
After starting transaction id = 4 
After starting transaction id = 5 

kent$ awk -F= '{a[$2]++;}END{for(i in a)if(a[i]!=2)print "id:"i}' file 
id: 3 
id: 5 
2

提取BeforeAfter ID,然後diff的他們,就像這樣:

$ diff -wb <(grep Before file | cut -d= -f2 | sort) <(grep After file | cut -d= -f2 | sort) 

如果你的shell不支持process substitution<(...),然後使用臨時文件:

$ grep Before file | cut -d= -f2 | sort > before 
$ grep After file | cut -d= -f2 | sort > after 
$ diff -wb before after 
1

grep不是這項工作的最好過,因爲它無法讀取多行。您可以將它們與-B1配對讀取,但您仍然使用sed,awk或其他更強大的工具解析該文件。

這裏的另一種方法是同樣適用的情況下,你會得到extraneus線之前(在echo在那裏只是讓你可以幹運行它):

$ echo 'Before starting transaction id = 123 
After starting transaction id = 123 
After starting transaction id = 54675 
Before starting transaction id = 567 
After starting transaction id = 567' | 
    sort -k6 | uniq -u -f5 # end cmd 
After starting transaction id = 54675 

它通過檢查只是唯一的ID。因爲我不知道你在那裏得到什麼樣的內容,也許他們是現有條目的重複,在這種情況下,你將不得不做不同的事情。下面是更安全的方法,它捕獲這兩種情況下,並用多於或少於2 ID頻率返回OCCURENCES:

$ echo 'Before starting transaction id = 123 
After starting transaction id = 123 
After starting transaction id = 567 
Before starting transaction id = 567 
After starting transaction id = 567' | 
    sort -k6 | uniq -c -f5 | grep -v "^[[:space:]]*2[[:space:]]" 
3 After starting transaction id = 567