2010-10-01 60 views
2

我做了大量日志文件分析的紧急分析。通常这需要拖尾日志并寻找更改。如何突出显示文件中后续行之间的差异?

我很想有一个解决方案,突出显示这些变化,使眼睛更容易跟踪。

我调查过的工具并没有出现任何问题,我在找什么。我已经用Perl编写了一些脚本,但是我想要一个更完整的解决方案。

任何人都可以推荐一个工具吗?

回答

1

我为此写了一个Python脚本,利用difflib.SequenceMatcher

#!/usr/bin/python3 

from difflib import SequenceMatcher 
from itertools import tee 
from sys import stdin 

def pairwise(iterable): 
    """s -> (s0,s1), (s1,s2), (s2, s3), ... 

    https://docs.python.org/3/library/itertools.html#itertools-recipes 
    """ 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 

def color(c, s): 
    """Wrap string s in color c. 

    Based on http://stackoverflow.com/a/287944/1916449 
    """ 
    try: 
    lookup = {'r':'\033[91m', 'g':'\033[92m', 'b':'\033[1m'} 
    return lookup[c] + str(s) + '\033[0m' 
    except KeyError: 
    return s 

def diff(a, b): 
    """Returns a list of paired and colored differences between a and b.""" 
    for tag, i, j, k, l in SequenceMatcher(None, a, b).get_opcodes(): 
    if tag == 'equal': yield 2 * [color('w', a[i:j])] 
    if tag in ('delete', 'replace'): yield color('r', a[i:j]), '' 
    if tag in ('insert', 'replace'): yield '', color('g', b[k:l]) 

if __name__ == '__main__': 
    for a, b in pairwise(stdin): 
    print(*map(''.join, zip(*diff(a, b))), sep='') 

input.txt

108 finished /tmp/ts-out.5KS8bq 0  435.63/429.00/6.29 ./eval.exe -z 30 
107 finished /tmp/ts-out.z0tKmX 0  456.10/448.36/7.26 ./eval.exe -z 30 
110 finished /tmp/ts-out.wrYCrk 0  0.00/0.00/0.00 tail -n 1 
111 finished /tmp/ts-out.HALY18 0  460.65/456.02/4.47 ./eval.exe -z 30 
112 finished /tmp/ts-out.6hdkH5 0  292.26/272.98/19.12 ./eval.exe -z 1000 
113 finished /tmp/ts-out.eFBgoG 0  837.49/825.82/11.34 ./eval.exe -z 10 

cat input.txt | ./linediff.py输出:

linediff output

3

Levenshtein距离

百科: 的Levenshtein两个字符串之间的距离是一个串转换成另一个,其中的操作是插入,缺失,或单个字符的替代所需的操作的最小数量。

public static int LevenshteinDistance(char[] s1, char[] s2) { 
    int s1p = s1.length, s2p = s2.length; 
    int[][] num = new int[s1p + 1][s2p + 1]; 

    // fill arrays 
    for (int i = 0; i <= s1p; i++) 
     num[i][0] = i; 

    for (int i = 0; i <= s2p; i++) 
     num[0][i] = i; 

    for (int i = 1; i <= s1p; i++) 
     for (int j = 1; j <= s2p; j++) 
      num[i][j] = Math.min(Math.min(num[i - 1][j] + 1, 
        num[i][j - 1] + 1), num[i - 1][j - 1] 
        + (s1[i - 1] == s2[j - 1] ? 0 : 1)); 

    return num[s1p][s2p]; 
} 

示例应用程序在Java中

字符串DIFF

alt text

应用程序使用LCS算法来连接2个文本输入到1.结果将包含最小的指令集,使一个字符串另一个。显示指令下面的文本。

下载应用程序: String Diff.jar

下载来源: Diff.java

+0

由于马格努斯,看起来像一个良好的算法中了解/添加到列表中。可能会帮助我滚动自己的差异突出显示,但理想情况下希望在我的回答中找到像这样的库/工具 – HaveAGuess 2010-10-02 13:38:20

+0

Linux有强大的“差异”命令,我会研究这一点。 – Margus 2010-10-02 15:34:30

+0

谢谢,我是这个和其他差异工具的热衷用户。我更新了问题的措辞给更多的背景.. – HaveAGuess 2011-04-12 10:20:22

相关问题