【问题标题】:Grep file and export vars in loop循环中的 Grep 文件和导出变量
【发布时间】:2013-05-28 17:27:00
【问题描述】:

想要 grep 文件并像分隔的 var 一样导出行,最后两个在一个 var 中。 之后创建循环并导出 html 标签中的变量。

文件查看:

1.1.1.1 host red  70%     /
1.1.1.1 host green        0%      /dev/shm
1.1.1.1 host green        63%     /staging/om_campaign_files
1.1.1.1 host red  71%     /mnt/OBCDir

导出变量后的预期视图:

<tr><td>1.1.1.1<td/><td>host<td/><td color=red>/mnt/OBCDir<td/></tr>

【问题讨论】:

    标签: perl bash awk grep


    【解决方案1】:

    如果您正在寻找程序中可用的东西,而不是命令提示符下的单行:

    #!/usr/bin/env perl    
    
    use strict;
    use warnings;
    use 5.010;
    
    while (my $line = <DATA>) {
      chomp $line;
      my ($ip, $hostname, $color, undef, $mount) = split ' ', $line;
      say "<tr><td>$ip</td><td>$hostname</td><td color=$color>$mount</td></tr>";
    }
    
    __DATA__
    1.1.1.1 host red  70%     /
    1.1.1.1 host green        0%      /dev/shm
    1.1.1.1 host green        63%     /staging/om_campaign_files
    1.1.1.1 host red  71%     /mnt/OBCDir
    

    输出:

    <tr><td>1.1.1.1</td><td>host</td><td color=red>/</td></tr>
    <tr><td>1.1.1.1</td><td>host</td><td color=green>/dev/shm</td></tr>
    <tr><td>1.1.1.1</td><td>host</td><td color=green>/staging/om_campaign_files</td></tr>
    <tr><td>1.1.1.1</td><td>host</td><td color=red>/mnt/OBCDir</td></tr>
    

    【讨论】:

      【解决方案2】:

      使用awk 只需根据需要插入每个字段:

      awk '{print "<tr><td>"$1"</td><td>"$2"</td><td color="$3">"$5"</td></tr>"}' file
      <tr><td>1.1.1.1</td><td>host</td><td color=red>/</td></tr>
      <tr><td>1.1.1.1</td><td>host</td><td color=green>/dev/shm</td></tr>
      ...
      

      注意:还修复了一些结束标签,例如 &lt;td/&gt;&lt;/td&gt;

      【讨论】:

        【解决方案3】:
        perl -anE 'say "<tr><td>$F[0]<td/><td>$F[1]<td/><td color=$F[2]>$F[4]<td/></tr>"' file
        

        【讨论】:

          【解决方案4】:

          bash 解决方案。我假设输出是由一些外部实用程序生成的。此外部实用程序由cat infile 模拟(请参阅coproc)。除了调用外部实用程序外,没有额外的 fork。

          coproc cat infile
          while read -u ${COPROC[0]} i j k l m; do
            echo "<tr><td>$i<td/><td>$j<td/><td color=$k>$m</td></tr>"
          done
          

          这个程序在后台启动一个 proc。它的stdout 被重定向到存储在${COPROC[0]} 中的文件句柄。此句柄在 while 循环中读取。

          或者没有coproc(注意&lt;&lt;(之间的空格!):

          while read i j k l m; do
            echo "<tr><td>$i<td/><td>$j<td/><td color=$k>$m</td></tr>"
          done < <(cat infile)
          

          如果输入在文件中,那么它可以像这样使用

          while read i j k l m; do
            echo "<tr><td>$i<td/><td>$j<td/><td color=$k>$m</td></tr>"
          done <infile
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多