awk - grep 匹配模式后的下一个单词,直到第一个空格

标签 awk grep

我正在尝试获取“MODULE”之后的单词,其中,

  1. MODULE与“待匹配词”之间可以有一个或多个空格。

  2. “待匹配词”和它的下一个词之间的单个空格

  3. 待匹配词可以是任何模式

    HAL_POINT ITERATION IMPLEMENTED VERSION MODULE  1.2.3/4 OLKI 9FEB17 3MAR2018 
    3.2.6    
    CHK_PONT VALUES IMPLEMENTED VERSION MODULE 350/4 OLKI 9FEB17 3APR2018 
    3.2.6
    HAL_POINT ITERATION JIO_PO POINT MODULE     RT/6T OLKI 9FEB17 3MAR2018 
    3
    

我试过了

echo $variable | grep -oP '(?<=MODULE\s)\d.\d.\d\/\d'

echo $variable | grep -oP '(?<=MODULE\s\s)\d.\d.\d\/\d' 

对于第一行,但我希望它更优雅和通用。

要匹配的词是 1.2.3/4350/4RT/6T

最佳答案

如果您非常确定单词是否由空格分隔,则可以使用 awk,因为默认情况下 awk 在输入行中用白色分隔字段 -空格字符。对于给定的输入,您只需要

awk '{ for( i=1; i<=NF ;i++ ) if ( $i == "MODULE" ) { print $(i+1); break } }' 

for 循环一直运行到 NF,这基本上意味着运行到当前行中被空白字符分隔的最后一行条目。

如果您仍然坚持使用 grep,您可以通过以下操作改进正则表达式。在 PCRE 中,您可以使用 ? 通过执行 (\s+)? 来匹配可变数量的空白字符,并且只获取没有空白的部分。

grep -oP '(?<=MODULE)(\s+)?\K([^ ]*)'

参见 Regular Expression from regex101为您给定的输入工作。

关于awk - grep 匹配模式后的下一个单词,直到第一个空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55027495/

相关文章:

linux - 如何从纯文本中 grep 键值存储中的值

linux - 从 grep 输出中删除 </p> 标签

linux - 确定哪些关键字可以在哪些文件中找到

bash - 使用 AWK 基于一个文件创建文件夹,并根据另一文件创建这些文件夹中的文件

linux - 在 Linux 中使用 awk 从命令输出中查找特定数据

linux - 如何列出响应时间大于 6000 毫秒的所有日志

linux - 在多次 sed 运行中获取重复条目

shell - 在文件中搜索多个模式并在模式匹配时删除行

bash - grep 与以下以空格开头的行匹配

linux - 如何每运行 X 次脚本就删除一个文件 - 从脚本内部管理日志文件?