使用grep -e检索默认值?

时间:2011-11-01 23:06:27

标签: grep

我正在解析文本文件,寻找像这样的特定条目

grep -e 'Model' -e 'Manufacturer' -e 'Man Date' -e 'SW Version' -e' SW Name' -e 'HW Version' -e 'Receiver ID' JGMDTV356.HDD

这给了我一个像这样的输出

Model         = HR24
Manufacturer  = 100
Man Date      = 04/14/2010
SW Version    = 4D1
HW Version    = 2.3
Receiver ID   = 035635905389
Model         = WDCWD5000AVVS-63M8B0 (Dragonfly-0)

问题是某些文件的字段数不同。我怎么能这样做?

Model         = HR24
Manufacturer  = 100
Man Date      = N/A
SW Version    = 4D1
HW Version    = N/A
Receiver ID   = N/A
Model         = N/A

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

因此,如果文件JGMDTV356.HDD不包含任何行匹配模式FOO,那么您希望grep打印出FOO = N/A吗? grep无法做到这一点。您可能需要查看gawk的文本文件处理,这比grep可以处理的更复杂。

答案 1 :(得分:1)

正如马修所提到的,你要做的事情超出了grep的预期用途。 awk是为这类东西而制作的,可以在大多数Linux发行版(gawk是GNU实现)甚至许多嵌入式Linux系统上使用。有一个很好的教程here,需要一个小时的时间,并教你几乎所有你需要知道的。

以下是解决问题所需的awk代码:

#!/bin/awk -f                                                                                             

BEGIN {
    tokens["Model"] = 0
    tokens["Manufacturer"] = 0
    tokens["Man Date"] = 0
    tokens["SW Version"] = 0
    tokens["HW Version"] = 0
    tokens["Receiver ID"] = 0
}

{
    for (token in tokens){
        if ($1 == token){
            print $0;
            tokens[$1]++;
        }
    }
}

END {
    for (token in tokens){
        if( tokens[token] == 0){
            printf("%-13s = NA\n" , token)
        }
    }
}

将其保存到tmp.awk并将执行权限添加到tmp.awk。

cat <your file> | ./tmp.awk

这将打印出你想要的内容。