删除文件中的匹配对

时间:2012-12-20 09:46:23

标签: regex shell sed awk

在我寻求在C ++代码中找到特别持久的内存泄漏时,我决定以下列格式将所有分配写入日志文件:

  

<alloc|free> <address> <size> <UNIQUE-ID> <file> <line number>

这给了我,例如:

alloc 232108     60   405766 file1.cpp (3572)
free  232128     60   405766
alloc 232108     60   405767 file1.cpp (3572)
free  232128     60   405767
alloc 7a3620  12516   405768 file2.cpp (11435)
free  7a3640  12516   405768
alloc 2306c8    256   405769 file3.cpp (3646)
alloc 746160   6144   405770 file3.cpp (20462)
alloc 6f3528   2048   405771 file4.h (153)
alloc 6aca50    128   405772 file4.h (153)
alloc 632ec8    128   405773 file4.h (153)
alloc 732ff0    128   405774 file4.h (153)
free  746180   6144   405770
free  632ee8    128   405773
alloc 6a7610   2972   405778 this_alloc_has_no_counterpart.cpp (123)
free  6aca70    128   405772
free  733010    128   405774
free  6f3548   2048   405771
alloc 6a7610   2972   405775 file3.cpp (18043)
alloc 7a3620  12316   405776 file5.cpp (474)
alloc 631e00    256   405777 file3.cpp (18059)
free  7a3640  12316   405776
free  6a7630   2972   405775
free  631e20    256   405777
free  2306e8    256   405769

我正在尝试将每个allocfree匹配,只留下alloc而没有free对应的广告,例如,分配号{{1} }。

我能想到的是以下shell脚本:

405778

正如您可能已经猜到的那样,这个25MB文件的速度非常缓慢(即每秒2个循环),大约144000 #!/bin/sh grep "^alloc" test.txt | while read line do alloc_nr=`echo $line | awk '{ print $4 }'` # arg4 = allocation number echo "Processing $alloc_nr" sed -i "/ ${alloc_nr}/{//d}" test.txt done s,因为我以极低效的方式使用alloc。 / p>

如果有人能够在没有花费三个小时的情况下如何实现这一目标的话,我会非常感激。

2 个答案:

答案 0 :(得分:3)

awk '/^alloc/ { a[$4]=$0; }
     /^free/ { delete a[$4]; }
     END { for (i in a) {print a[i]; }' test.txt

答案 1 :(得分:3)

似乎你只想要ID而不是整行:

$ awk '{print $4}' file | sort | uniq -u
405778

awk '{print $4}'仅打印ID列。

sort对列进行排序。

uniq -u仅显示唯一ID。

编辑:

管道到grep -f - file以匹配整条线,无需循环:

$ awk '{print $4}' file | sort | uniq -u | grep -f - file
alloc 6a7610   2972   405778 this_alloc_has_no_counterpart.cpp (123)

grep -f匹配文件中的模式,-表示使用stdin