【问题标题】:Get the word after a match in a line when line has multiple match当行有多个匹配时,获取一行中匹配后的单词
【发布时间】:2016-10-12 18:57:15
【问题描述】:

我有一个大文本文件,内容如下:

Register foo1 ... Register foo2 ... Register foo10...
Register foo20 ...
Un-Register bar1 ... Register foo21 ...

我在下面写了 bash 脚本,它只有在每行有一个“寄存器”时才有效,但是如何让所有 foo 都在同一行?

#!/bin/bash
file=/tmp/log
grep -e 'Register\s' $file | awk '{print $2}' | grep -v Un-Register | while read -r line; do
    #do something with $line
done

【问题讨论】:

  • 期待:foo1 foo2 foo10 foo20 foo21,我可以按照下面的建议使用 Perl,谢谢。
  • 好的,你有 perl 和 awk 的答案。

标签: bash perl shell awk


【解决方案1】:

试试这个:

perl -pe 's/\s+Register/\nRegister/g' file |
  grep -oP '^Register\s+\Kfoo\S*'

输出:

foo1
foo2
foo10...
foo20
foo21

【讨论】:

  • 感谢您的回答,它如何匹配以Register 开头的行?,您使用了\s+Register,它应该只匹配Register 后跟的空格,对吗?
  • 因为第一个命令只是将Register 放在行首。所以,这已经是第一行的情况,没有修改,下一个grep 命令将按照它应该的方式进行匹配
【解决方案2】:

这里有一个 perl 单行语句,用于查找 "Register" 而不是 "Un-Register" 之后的单词,并且一行中的所有单词都将保留在一行中

$ perl -nE 'say "@{[/(?<!Un-)Register\s+\K\S+/g]}"' file
foo1 foo2 foo10...
foo20
foo21

密度较小的版本:

$ perl -nE '
      @words = /  (?<!Un-)        # preceding characters are not "Un-"
                  Register \s+    # must have "Register" followed by whitespace
                  \K              # disregard the previous from matching
                  \S+             # capture the next non-whitespace characters
              /gx;                # "g"lobally on this line
      say "@words";
  ' file

【讨论】:

    【解决方案3】:

    这是完成工作的非正则表达式 awk 解决方案:

    awk '{
       s=""
       for (i=2; i<=NF; i++)
          if ($(i-1) == "Register")
             s = sprintf("%s%s", (s==""?"":s OFS), $i)
       print s
    }' file
    
    foo1 foo2 foo10...
    foo20
    foo21
    

    【讨论】:

      【解决方案4】:

      egrep -o '(^|[^-])Register \w*' file | awk '{print $2 }'

      • 首先 grep 过滤 Register word(而不是 Un-Register)并在新行中打印匹配项(-o 选项)
      • awk 只打印单词

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 2011-03-20
        • 1970-01-01
        • 2017-11-30
        相关资源
        最近更新 更多