我有大约600个文件,这些文件的名称类似于他们有信息并且.dgt
扩展名为的机器的IP地址。我尝试搜索这些文件中的参数,并在给定参数正确的情况下从这些文件中提取2行。我使用的是aix控制台,经过一些搜索,我在这里找到了sed
命令。我给你留下了一个搜索的例子。
sed -n -e '/XP/,$p' 181* > machines1
sed -e '/XP/,$d' 181* > machines1
更具体地说,在Diretory中我有一个所有企业机器的文件列表,它是这样的:
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
它们包含以下信息:
MachineName= M125EEE
...
...
...
CurrentIP=XXX.XXX.XXX.XXX
...
...
OS=XP
...
...
...
我试图获取已安装XP的所有计算机的列表,因此我尝试提取OS行和MachineName行,以便我可以获得这样的文件...
MachineName= M125EEE
OS=XP
MachineName= M125EEE
OS=XP
MachineName= M125EEF
OS=XP
MachineName= M125EEG
OS=XP
答案 0 :(得分:2)
试试这个:
awk '
BEGIN{ FS=OFS="=" }
{ map[FILENAME,$1] = $2 }
END {
for (file in ARGV) {
if ( map[file,"OS"] == "XP" ) {
tag="MachineName"; print tag, map[file,tag]
tag="OS"; print tag, map[file,tag]
tag="CurrentIP"; print tag, map[file,tag]
}
}
}
' 181*
进行简单明了的调整,输出你喜欢的任何值......
答案 1 :(得分:1)
修改强>
这将执行所要求的,但比第一版更简单(更短):
sed -ne '/^MachineName=/h;/^OS=XP/{x;G;p}' 181*dgt >machines
与第一个以下答案相同:
拳头回答
这可以胜任:
sed -ne '/^MachineName=/{h};/^OS=/{/=XP/!d;x;G;p;d;h}' 181*.dgt >machines
cat machines
MachineName= M125EEE
OS=XP
MachineName= M125EEE
OS=XP
MachineName= M125EEF
OS=XP
MachineName= M125EEG
OS=XP
但如果您不需要每次都打印OS=XP
,因为这是唯一匹配的字符串,您可以将其保留:
sed -ne '/^MachineName=/{h};/^OS=XP$/{g;p}' 181*.dgt >machines
cat machines
MachineName= M125EEE
MachineName= M125EEE
MachineName= M125EEF
MachineName= M125EEG
如果您只想要机器名但不需要MachineName=
,则可以:
sed -ne '/^MachineName=/{s/^.*= *//;h};/^OS=XP$/{g;p}' 181*.dgt >machines
cat machines
M125EEE
M125EEE
M125EEF
M125EEG
答案 2 :(得分:1)
它不像其他一些解决方案那样具有运行时效率,但对于如此少量的文件,这种简单易懂的解决方案可能是合适的:
grep -h MachineName $(grep -l OS=XP 181*)
grep -l表示只打印匹配文件的名称。然后我们使用这些文件名作为文件列表来搜索MachineName行(-h表示禁止文件名)。