【问题标题】:Retrieve default value with grep -e?使用 grep -e 检索默认值?
【发布时间】:2011-12-19 21:58:15
【问题描述】:

我正在解析文本文件以寻找特定的条目

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

这样可以吗?

【问题讨论】:

    标签: grep


    【解决方案1】:

    正如 Matthew 所提到的,您尝试做的事情超出了 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

    这将打印出你想要的。

    【讨论】:

    • 太棒了!不知道我能做到这一点。谢谢你。接受并投票。
    【解决方案2】:

    那么,如果文件JGMDTV356.HDD 不包含任何行匹配模式FOO,您希望grep 打印出FOO = N/Agrep 不能那样做。您可能想看看 gawk 的文本文件处理,它比 grep 可以处理的更复杂。

    【讨论】:

    • 感谢您的回复。我会考虑使用 awk。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多