从空格分隔的文本文件中提取特定键的所有值

时间:2014-09-18 18:19:40

标签: regex awk grep

有一个格式为

的文本文件
1=23 2=44 15=17:31:37.640 5=abc 15=17:31:37.641 4=23 15=17:31:37.643 15=17:31:37.643

我需要一个正则表达式来提取多行文本文件的键15的所有值

输出应该是

17:31:37.640 17:31:37.641 17:31:37.643 17:31:37.643

很抱歉,我应该说明我尝试提取的值是时间戳17:31:37.643

3 个答案:

答案 0 :(得分:2)

您可以使用sed

sed 's/15=\([^ ]*\)/\1/g;s/[0-9]\+[^ ]\+ //g' input.file

在OP添加预期输出之前给出了答案,它也会起作用,但在每个值之后添加一个新行:

如果你有GNU grep,你可以使用perl兼容的正则表达式模式附带的lookbehind assertion

grep -oP '(?<=15=)[^ ]*' <<< '1=23 2=44 15=xyz 5=abc 15=yyy 4=23 15=omnet 15=that'

输出:

xyz
yyy
omnet
that

答案 1 :(得分:2)

您可以使用GNU grep来提取子字符串。

grep -Po '\b15=\K\S+' | tr '\n' ' '
  • -P选项将模式解释为Perl正则表达式。
  • -o选项仅显示与模式匹配的匹配部分。
  • \K抛弃了与此相匹配的所有内容。

输出

17:31:37.640 17:31:37.641 17:31:37.643 17:31:37.643 

答案 2 :(得分:2)

使用awk

awk -F'=' -v RS=' ' -v ORS=' ' '$1==15 { print $2 }' file
xyz yyy omnet that

将输入和输出记录分隔符设置为空格,将输入字段分隔符设置为=。测试column1的条件为15。如果是这样,请打印第二列。

正如Ed Morton在评论中所建议的那样,这会留下一个空白的空白字符,甚至是一条缺席的新行。如果这是一个问题,您可以使用GNU awk对多字符RS使用以下内容。

gawk -F'=' -v RS='[[:space:]]+' '$1==15{ printf "%s%s", (c++?OFS:""), $2 } END{print ""}' file
相关问题