多文件参数搜索bash

时间:2012-11-21 16:11:02

标签: bash sed

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

3 个答案:

答案 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表示禁止文件名)。