我有大约 600 个文件,以它们拥有信息的机器的 IP 地址命名,并带有.dgt
扩展名。我正在尝试在这些文件中搜索参数,如果给定参数正确,则从这些文件中提取 2 行。我正在使用 aix 控制台,经过一些搜索,我在这里找到了 sed
命令。我给你留下一个我搜索的例子。
sed -n -e '/XP/,$p' 181* > machines1
sed -e '/XP/,$d' 181* > machines1
更具体地说,在目录中,我有一个我所有企业机器的文件列表,它是这样的:
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
181xxxxxxxxx.dgt
它们包含如下信息:
MachineName= M125EEE
...
...
...
CurrentIP=XXX.XXX.XXX.XXX
...
...
OS=XP
...
...
...
我正在尝试获取安装了XP的所有计算机的列表,因此我正在尝试提取操作系统行和MachineName行,以便我可以获取这样的文件...
MachineName= M125EEE
OS=XP
MachineName= M125EEE
OS=XP
MachineName= M125EEF
OS=XP
MachineName= M125EEG
OS=XP
试试这个:
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*
进行简单、明显的调整以输出您喜欢的任何值......
它不像其他一些解决方案那样具有运行时效率,但对于如此少量的文件,这个简单易懂的解决方案可能是合适的:
grep -h MachineName $(grep -l OS=XP 181*)
grep -l 表示仅打印匹配的文件的名称。 然后,我们将这些文件名称用作文件列表来搜索 MachineName 行(-h 表示禁止文件名)。
编辑:
这将完成要求,但比第一个版本更简单(更短):
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