String bash-如何从文件中查找字符串并获取其位置?

String bash-如何从文件中查找字符串并获取其位置?,string,bash,find,String,Bash,Find,文件服务-包含许多类似以下的记录: define service { host_name\t\t\t\tHOSTNAME ... ... } 文件主机-包含以下记录: define host { host_name\t\t\t\tHOSTNAME ... ... } 我需要转到主机,以某种方式从第一条记录中获取主机名,然后转到文件服务,找到具有该主机名的所有记录,并将它们放到另一个文件中。然后对主机中的每个主机名执行此操作 我不知道的是如何从文

文件服务-包含许多类似以下的记录:

define service {
    host_name\t\t\t\tHOSTNAME
    ...
    ...
}
文件主机-包含以下记录:

define host {
    host_name\t\t\t\tHOSTNAME
    ...
    ...
}
我需要转到主机,以某种方式从第一条记录中获取主机名,然后转到文件服务,找到具有该主机名的所有记录,并将它们放到另一个文件中。然后对主机中的每个主机名执行此操作

我不知道的是如何从文件主机获取主机名,然后如何在文件服务中将整个记录获取到一个变量。我已经准备了一个正则表达式,希望它是正确的^define.*主机名\t\t\t$HOSTNAME.*}


请给我一些建议或示例,说明如何获得想要的结果。

对于bash脚本来说,这项任务有点太复杂了。我将使用Perl:

!/usr/bin/perl 使用警告; 严格使用;
打开我的$SRV,“这个任务对于bash脚本来说有点太复杂了。我将使用Perl:

!/usr/bin/perl 使用警告; 严格使用;
打开我的$SRV,“您提供的文件看起来非常像nagios配置文件

sed可能是您在这里的朋友,因为它允许您将文件分割成更小的部分,例如:

:t
/^define service {/,/}$/ {    # For each line between these block markers..
   /}$/!{         #   If we are not at the /end/ marker
      $!{          #     nor the last line of the file,
         N;        #     add the Next line to the pattern space
         bt
      }            #   branch (loop back) to the :t label.
   }               # This line matches the /end/ marker.
   /host_name[ \t]\+HOSTNAME\b/!d;       # delete the block if wrong host.
}
该示例摘自sed faq 4.21,并稍作修改。你也可以看看问题4.22,它似乎直接解决了这个问题:


与前面的答案一样,我也倾向于说您最好使用另一种脚本语言。如果你需要一个不同的解释器来完成这项工作,不妨使用你知道的东西。

你提供的文件看起来非常像nagios配置文件

sed可能是您在这里的朋友,因为它允许您将文件分割成更小的部分,例如:

:t
/^define service {/,/}$/ {    # For each line between these block markers..
   /}$/!{         #   If we are not at the /end/ marker
      $!{          #     nor the last line of the file,
         N;        #     add the Next line to the pattern space
         bt
      }            #   branch (loop back) to the :t label.
   }               # This line matches the /end/ marker.
   /host_name[ \t]\+HOSTNAME\b/!d;       # delete the block if wrong host.
}
该示例摘自sed faq 4.21,并稍作修改。你也可以看看问题4.22,它似乎直接解决了这个问题:

与前面的答案一样,我也倾向于说您最好使用另一种脚本语言。如果你需要一个不同的解释器来完成这项工作,不妨使用一些你知道的东西