【问题标题】:Grep more than one string in a single lineGrep 一行中的多个字符串
【发布时间】:2015-10-16 16:04:44
【问题描述】:

我试图在一行中找到两个字符串。下面是示例行。

line1: xxxx yyyy time1-12 zzzz time2-13
line2: xxxx yyyy time1-14 zzzz time2-15

我正在使用下面的 grep 命令来实现这一点

grep -o -E 'time1-[0-9]*|time2-[0-9]*' timetest.txt

这给了我输出

time1-12
time2-13
time1-14
time2-15

但我想要这样

time1-12 time2-13
time1-14 time2-15

我在这里缺少什么?我可以使用 awk 或 sed 来获取此输出吗

【问题讨论】:

  • 试试awk '{print $4 " " $6}' timetest.txt

标签: unix awk sed grep


【解决方案1】:

使用 GNU awk 将第三个参数匹配():

$ awk 'match($0,/time1-[0-9]*/,a) && match($0,/time2-[0-9]*/,b) { print a[0], b[0] }' file
time1-12 time2-13
time1-14 time2-15

注意time1和time2可以是任意顺序就行了。对于其他 awk,您需要使用 substr() 来提取 match() 结果:

$ awk 'match($0,/time1-[0-9]*/) && (a=substr($0,RSTART,RLENGTH)) && match($0,/time2-[0-9]*/) { print a, substr($0,RSTART,RLENGTH) }' file
time1-12 time2-13
time1-14 time2-15

如果 2 次总是以相同的顺序,那么使用 gawk 你可以这样做:

$ awk 'match($0,/(time1-[0-9]*).*(time2-[0-9]*)/,a) { print a[1], a[2] }' file
time1-12 time2-13
time1-14 time2-15

但它只是单独一行的简单替换,所以你也可以只使用 sed:

$ sed -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file
time1-12 time2-13
time1-14 time2-15

【讨论】:

    【解决方案2】:

    Perl 的救援:

    perl -lne 'print "$1 $2" if /(time1-[0-9]+).*(time2-[0-9]+)/' timetest.txt
    

    代码假定time1 总是在time2 之前。

    【讨论】:

      【解决方案3】:

      另一种解决方案,使用grep

      grep -o -E 'time[0-9]+-[0-9]+' timetest.txt | paste -d " " - -
      

      你明白了,

      时间1-12 时间2-13 时间1-14 时间2-15

      【讨论】:

      • 这也是我的想法。唯一的困难:如果每行没有 2 个匹配项,输出可能会合并来自不同行的匹配项。
      【解决方案4】:

      试试这个 sed 命令,

      sed 's/[^t]\+\(time[^ ]\+\)/\1 /g' FileName
      

      或

      sed 's/[^t]\+\(time\(1\|2\)[^ ]\+\)/\1 /g' FileName
      

      输出:

      time1-12 time2-13 
      time1-14 time2-15
      

      Cut版本

      cut -d" " -f 4,6 FileName
      

      【讨论】:

      • 这只是打印包含以time 开头的字符串的任何行的结尾,它不会查找 OP 关心的 2 个特定正则表达式。
      【解决方案5】:
      awk -vRS="time[12]-[0-9]+" '{$0=RT}1' filename
      time1-12
      time2-13
      time1-14
      time2-15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        相关资源
        最近更新 更多