#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.