【问题标题】:Match a particular letter and print word after that using SED使用 SED 匹配特定字母并在此之后打印单词
【发布时间】:2018-12-21 17:34:09
【问题描述】:

我有一个文件“Log.txt”,如下所示:

 bla bla.. line1   
 bla bla.. line2  
 bla bla.. lineN     
:000000 ... 239e670... A  bla1.txt  
:000000 ... 76fd777... M  bla2.txt  
:000000 ... e69de29... A  bla3.txt 

假设我正在寻找字母“A”和“M”。

我将如何仅在仅包含此特定字母的第 4 个字段或行中查找它。我只需要匹配单词“A”和“M”,然后打印文件名。即我需要得到如下的最终输出:

A   bla1.txt
M   bla2.txt
A   bla3.txt  

我使用 awk 将第 4 列与 A 和 M 匹配并打印下一个单词。但没有得到预期的输出。我也得到了额外的 Bla Bla 行。

有人知道如何使用 sed 实现这一点吗?

【问题讨论】:

  • 您的“A”或“M”是否仅出现在第 4 个字段中,还是可以出现在该行的任何位置?
  • @user123 是在实际文件中,“A”或“M”出现在第 4 个字段中。但它不应与任何其他包含 A 或 M 的单词匹配(即 RAJESH,其中包含 A)
  • 要获得调试代码的帮助,您必须向我们展示您的代码。请将其添加到您的问题中。

标签: bash shell awk sed


【解决方案1】:

awk为此:

awk '$4 ~ /^[AM]$/ { print $4," ",$5 }' Log.txt

sed 为它:

sed -En '/^([^ ]+ ){3}[AM]/ { s/^([^ ]+ ){3}([AM] .*)/\2/; p; }' Log.txt

这两个都确认AM 在第四个字段中。

【讨论】:

    【解决方案2】:

    awk 其实可以做你的工作,只需要添加一个条件:

    awk "/ (A|M) /{print $4,$5}" Log.txt
    

    至于 sed,你可以这样做:

    sed -nr "/ (A|M) /{s/.*((A|M)\s+.*)$/\1/;p}" Log.txt
    

    不确定你的真实数据是什么样的,但我想你会得到它并调整命令以适应它们。

    【讨论】:

      【解决方案3】:

      根据您的输入文件和预期的输出,请在下面使用awk

      awk '{if ($4 == "A" || $4 == "M") {print $4,$5}}' log.txt
      

      输出:

      A bla1.txt
      M bla2.txt
      A bla3.txt
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed 's/^\(\S*\s\)\{3\}\([AM]\s\)/\2/p;d' file
        

        将第四个字段匹配为AM,如果是,则删除前三个字段并打印剩余部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          • 2020-06-29
          • 1970-01-01
          相关资源
          最近更新 更多