多文件参数搜索 bash



我有大约 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

最新更新