如何在awk中搜索文件

时间:2013-05-30 07:03:07

标签: bash awk grep

我有2个单独的文件lostType.txt(显示所选的选项)和lost.txt(显示内存泄漏)我使用dialog来创建GUI。使用复选框,我从用户那里获取一些数字间隔来限制将要打印的内存泄漏。我要做的是,打印内存泄漏为选定大小的行,泄漏类型为lostType.txt

例如,这是lost.txt

LEAK SUMMARY
100 bytes definitely lost
0 bytes indirectly lost
0 bytes possibly lost
100 bytes still reachable
0 bytes suppressed

如果用户希望看到definetely丢失和间接丢失,lostType.txt具有以下内容

definetely
indirectly

假设用户选择查看泄漏,其中大小介于0到10个字节或100和250个字节之间。现在输出必须是100 bytes in 1 blocks definitely lost

到目前为止,我所做的是以下内容,

for choice in $choices
do
    case $choice in
    1)
        #"Memory Leak <= 10 Byte"
        cat lost.txt | awk '{
            if ($1 <= 10 && $1 > 0 )
                print $1,$2" ==>",$3,$4     
            }'
        ;;

    2)
        #"10 Byte < Memory Leak <= 50 Byte"
        cat lost.txt | awk '{
            if ($1 <= 50 && $1 > 10 )
                print $1,$2" ==>",$3,$4     
            }'
        ;;

也就是说,根据所选的大小间隔,我可以打印这些值。但是,我找不到寻找lostType的方法(上层代码为3美元)。我需要做的是在awk中搜索文件,如

cat lost.txt | awk '{
 if ($1 <= 50 && $1 > 10 AND IF $3 IS IN lostType.txt)
      print $1,$2" ==>",$3,$4   
 }'
;;

所以我的问题是,如何在awk中搜索文件?

1 个答案:

答案 0 :(得分:1)

如果我理解您的问题,则以下awk命令应该有效。您必须提供两个输入文件。丢失的类型保存在散列中,并将密钥与另一个的第三个字段进行比较。

awk '
    FNR == NR { type[ $1 ] = 1; next } 
    $1 > 10 && $1 < 200 && type[ $3 ] { print $1,$2 " ==> " $3,$4 }
' lostType.txt lost.txt

但是这样你就可以解析每个case选项。在我看来,应该是一个更好的解决方案,将这些变量传递给awk命令并只运行一次。

case $choice in
1)
    limit_inf=0
    limit_sup=10
    break
    ;;
2)
    limit_inf=10
    limit_sup=50
    break
    ;;
...

然后:

awk -v li="$limit_inf" -v ls="$limit_sup" '
    FNR == NR { type[ $1 ] = 1; next } 
    $1 > li && $1 < ls && type[ $3 ] { print $1,$2 " ==> " $3,$4 }
' lostType.txt lost.txt