【问题标题】:How to parse a file and exclude lines that share the same values?如何解析文件并排除共享相同值的行?
【发布时间】:2016-09-29 08:13:31
【问题描述】:

我正在尝试解析由我制作的脚本生成的输出文件,该脚本用于

下面是一个解析日志的例子:

17:21:07 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6ffb000 <0.000326>
17:21:07 mmap2(NULL, 8859, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6ff8000 <0.000337>
17:21:07 mmap2(NULL, 430216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f6c000 <0.000479>
17:21:07 mmap2(0xb6fd4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x68000) = 0xb6fd4000 <0.000571>
17:21:07 mmap2(NULL, 1258856, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6e38000 <0.000517>
17:21:07 mmap2(0xb6f66000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x126000) = 0xb6f66000 <0.001654>
17:21:07 mmap2(0xb6f69000, 9576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f69000 <0.002229>
17:21:07 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6ff7000 <0.000071>
17:21:07 munmap(0xb6ff8000, 8859)       = 0 <0.000568>
17:21:07 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6ffa000 <0.000082>

这是我用来解析的那一行:

cat ${traced}_brut.txt | grep "map" > ${traced}_parced.txt

现在,我要做的是删除具有相同十六进制值的行,以便更好地发现内存泄漏。

例如在这种情况下,波纹管应该从最终的日志文件中消失,因为它们共享相同的十六进制值:

17:21:07 mmap2(NULL, 8859, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6ff8000 <0.000337>
17:21:07 munmap(0xb6ff8000, 8859)    

【问题讨论】:

    标签: strace shell parsing logging strace


    【解决方案1】:

    使用基本的 shell 命令(我在 AIX 6 上。

    首先,找到您的重复项,例如用这个sed/sort/uniq,注册到一个新文件(比如输入在a.txt):

     sed -e 's/\(.*\)\(0x........\)\(.*\)/\2/' a.txt |sort  | uniq -c
    

    所以在“a.txt”中输入:

       1 0xb6e38000
       1 0xb6f66000
       1 0xb6f69000
       1 0xb6f6c000
       1 0xb6fd4000
       1 0xb6ff7000
       2 0xb6ff8000
       1 0xb6ffa000
       1 0xb6ffb000
    

    然后我们可以添加一个grep -v " 1 0x"| cut -c 6- | tr -d '[:blank:]' &gt; exclude.lst 以便仅在exclude.lst 中包含重复项(请注意,如果输入中的重复项超过 9 个,它将发生变化,因此您应该详细说明一下); (编辑:添加tr -d '[:blank:]' 以删除可能的空格)

    然后将文件重新用于grep -v您的输入;

    grep -vf exclude.lst a.txt
    

    编辑1

    总结起来,你可以用这 3 行来做:

    cat ${traced}_brut.txt | grep "map" > ${traced}_parced.txt 
    sed -e 's/\(.*\)\(0x........\)\(.*\)/\2/' ${traced}_parced.txt |sort | uniq -c | grep -v " 1 0x"| cut -c 6- | tr -d '[:blank:]' > exclude.lst 
    #grep -vf exclude.lst ${traced}_parced.txt > ${traced}_final.txt
    # above worked for me, but you may need to specify -F
    grep -F -vf exclude.lst ${traced}_parced.txt > ${traced}_final.txt
    

    edit2 我为你寻找;也许我们可以从https://unix.stackexchange.com/questions/83260/reading-grep-patterns-from-a-file 尝试这个-F?以上摘要已编辑。

    分享和享受。

    【讨论】:

    • 您好,我尝试了代码,但它似乎不起作用,而且如果有超过 9 个重复项是什么?
    • 所以我所做的是:cat ${traced}_brut.txt | grep "map" &gt; ${traced}_parced.txtsed -e 's/\(.*\)\(0x........\)\(.*\)/\2/' ${traced}_parced.txt |sort | uniq -c | grep -v " 1 0x"| cut -c 6- &gt; exclude.lstgrep -vf exclude.lst ${traced}_parced.txt &gt; ${traced}_final.txt
    • 排除列表工作正常,但是当我执行最后一个 grep 命令时它什么也不做,我尝试了 egrep 和 fgrep ,但是应该给出最终解析文本的 txt 文件没有任何反应,它保持不变并且不排除排除列表中的行。
    • ${traced}_final.txt 中的内容与 ${traced}_parsed.txt 中的内容相同。至于| tr -d '[:blank:]',我没有测试,但你会把它放在代码的什么地方。
    • 结果是一样的,不解析txt。它只是将其复制到另一个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2022-10-22
    • 2020-12-12
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多