1

我有大约 600 个文件,这些文件的名称类似于它们拥有信息并带有.dgt扩展名的机器的 IP 地址。如果给定参数正确,我正在尝试在这些文件中搜索参数并从这些文件中提取 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 的机器的列表,因此我正在尝试提取 OS 行和 MachineName 行,以便获得这样的文件...

MachineName= M125EEE
OS=XP
MachineName= M125EEE
OS=XP
MachineName= M125EEF
OS=XP
MachineName= M125EEG
OS=XP
4

3 回答 3

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*

进行简单、明显的调整以输出您喜欢的任何值...

于 2012-11-21T16:41:46.293 回答
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
于 2012-11-21T16:19:24.233 回答
1

它不像其他一些解决方案那样运行时效率高,但是对于如此少量的文件,这个简单易懂的解决方案可能是合适的:

grep -h MachineName $(grep -l OS=XP 181*)

grep -l 表示只打印匹配的文件名。然后我们使用这些文件名作为文件列表来搜索 MachineName 行(-h 表示禁止文件名)。

于 2012-11-21T17:03:00.707 回答