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

Awk grep匹配模式后的下一个单词,直到第一个空格,awk,grep,Awk,Grep,我想在模块后面找到单词,在那里 模块和要匹配的字之间可以有一个或多个空格 待匹配单词与下一个单词之间的单个空格 要匹配的单词可以是任何模式 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 ITERA

我想在模块后面找到单词,在那里

模块和要匹配的字之间可以有一个或多个空格

待匹配单词与下一个单词之间的单个空格

要匹配的单词可以是任何模式

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'

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

要匹配的字是1.2.3/4或350/4或RT/6T

如果您非常确定这些字是否不受空间限制,则可以使用awk,因为默认情况下,awk将输入行中的字段拆分为一个空格字符。对于给定的输入,您只需要

awk '{ for( i=1; i<=NF ;i++ ) if ( $i == "MODULE" ) { print $(i+1); break } }' 
请参阅针对给定输入的工作说明。

如果您非常确定单词是否不受空格限制,则可以使用awk,因为默认情况下,awk将输入行中的字段拆分为一个空格字符。对于给定的输入,您只需要

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

请参阅针对给定输入的工作方法。

和另一种不循环的awk方法

假设您的文本位于名为“小悟空”的文件中:


另一种awk方法,没有循环

假设您的文本位于名为“小悟空”的文件中:

您可以使用grep:Here\K将匹配但忽略其左侧的文本,[^]+表示它将匹配除空白以外的任何字符-o是只打印匹配的文本

grep -oP 'MODULE\s+\K[^ ]+'
您可以使用grep:Here\K将匹配但忽略其左侧的文本,[^]+表示它将匹配除空白以外的任何字符-o是只打印匹配的文本

grep -oP 'MODULE\s+\K[^ ]+'

请你也试一下下面的内容好吗

awk 'sub(/.*MODULE +/,"") && sub(/ +.*/,"")' Input_file

说明:将替换放在当前行中,用于将字符串模块中的所有内容都更改为NULL,并再次提到sub,用于将从空格到行尾的所有内容都替换为NULL。因此,如果两者之间存在替换发生和条件,则不会提及任何操作,因此默认情况下会打印该行。

请您也尝试一次以下操作

awk 'sub(/.*MODULE +/,"") && sub(/ +.*/,"")' Input_file
说明:将替换放在当前行中,用于将字符串模块中的所有内容都更改为NULL,并再次提到sub,用于将从空格到行尾的所有内容都替换为NULL。因此,如果替换发生和条件都存在于它们之间,则不会提及任何操作,因此默认情况下会打印该行