Получить значение по умолчанию с помощью grep -e?

#grep

#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
 

Можно ли это сделать?

Ответ №1:

Как упоминал Мэтью, то, что вы пытаетесь сделать, выходит за рамки предполагаемого использования grep. Awk был создан для такого рода вещей и доступен в большинстве дистрибутивов Linux (gawk — это реализация GNU) и даже во многих встроенных системах Linux. Здесь есть хороший учебник по этому вопросу, который займет менее часа и научит вас практически всему, что вам нужно знать.

Вот 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 = NAn" , token)
        }
    }
}
 

Сохраните это в tmp.awk и добавьте разрешения на выполнение в tmp.awk.

cat <your file> | ./tmp.awk

Это выведет то, что вы хотите.

Комментарии:

1. Удивительно! Понятия не имею, что я мог бы это сделать. Спасибо. Принято и проголосовано.

Ответ №2:

Итак, если файл JGMDTV356.HDD не содержит шаблона сопоставления строк FOO , вы хотите grep распечатать FOO = N/A ? grep не могу этого сделать. Возможно, вы захотите взглянуть на gawk для обработки текстовых файлов, которая сложнее, чем то, что grep может справиться.

Комментарии:

1. Спасибо за ваш ответ. Я рассмотрю возможность использования awk.