我正在解析文本文件,寻找像这样的特定条目
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
可以这样做吗?
答案 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
这将打印出你想要的内容。