【问题标题】:Getting text after a match from stdout [duplicate]从stdout匹配后获取文本[重复]
【发布时间】:2016-07-13 13:35:50
【问题描述】:

我想提取使用 grep 或诸如此类的特定单词之后的下一个单词/数字。

举个例子,这就是我在标准输出中所拥有的

string-a0 match-a1 string-a2 string-a3
string-b0 string-b1 match-b2 string-b3
match-c0 string-c1 string-c2 string-c3

我只想留下这个

string-a2
string-b3
string-c1

注意match-a1 != match-b2 != match-c0

编辑

一个具体的例子……

标准输出是这个

open 0.23 date ...
close 1.52 date ...
open 2.34 date ...
close 5.92 date ...
open 10.78 date ...
close 24.21 date ...
total 45.3

我正在搜索单词openclosetotal,所以输出应该是

0.23
1.52
2.34
5.92
10.78
24.21
45.3

【问题讨论】:

  • 为什么第 1 行是 string-a2 而不是 string-a0?
  • 因为我想要匹配后的 next 字符串
  • 您能详细说明您的匹配条件吗?或者一个更好的例子来说明你正在尝试做什么?
  • 我以为我做到了...我会再试一次
  • 我不知道 bash,但我想正则表达式会是 match-[abc][012] (\S+) 并抓住第一个捕获组。

标签: regex linux bash shell grep


【解决方案1】:

这与一般情况不匹配,但适用于您的示例:

awk '/^open|^close|^total/{print $2}' input

对于一般情况,如果您对“字符串”的定义是基于空格的,也许您想要:

tr -s ' \n' \\n < input | awk 'p{print; p=0} {p=/^open|^close|^total/}'

【讨论】:

  • 不是 $2 索引特定的吗?我不一定知道下一个单词的位置(按索引),这就是为什么我将通用大小写与string-*match-* 放在一起。注意匹配位置的不同
【解决方案2】:

您可以使用此 awk 在搜索词之后打印下一个词:

awk -v s='^(open|close|total)$' '{for (i=1; i<NF; i++) if ($i ~ s) print $(i+1)}' 

0.23
1.52
2.34
5.92
10.78
24.21
45.3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2012-11-22
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多