如何在特殊字符和其他单词之间提取单词

时间:2017-03-25 23:32:07

标签: bash

我正试图找到一种方法,如何在特殊字符和其他单词之间提取一个单词。

案文示例:

description "CST 500M TEST/VPNGW/11040 X {} // test"

description "test2-VPNGW-110642 -VPNGW"

我正在努力实现结果,只包括VPNGW这个词:

TEST/VPNGW/11040

test2-VPNGW-110642

我尝试使用grep和AWK,但看起来我的知识还不够。 使用awk '{$1=""; $2=""; ...进行打印的方法无效,因为整个单词并不总是在同一位置。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

使用grep,您只能输出与正则表达式匹配的字符串部分:

grep -o '[^ "]\+VPNGW[^ "]\+' file.name

答案 1 :(得分:0)

您可以尝试以下方式:

grep -Eoi 'test.*[0-9]'

当然这将是贪婪的,如果在所需字符串中的那些之后还有另一个数字,它将会抓到那里。通常情况下,我建议进行倒置测试,以阻止你不想要的东西:

grep -Eoi 'test[^ ]+'

这个问题就像你的第一个例子中一样,字符串'test'出现了多次,所以第一个例子的输出是:

TEST/VPNGW/11040
test"

当然,了解您的真实数据是什么样的,您可以自己决定哪种方式最适合

你可以使用grep中的perl regex机器并使用预测:

grep -Eoi 'test[^ ]+(?= )'

但是,如果你在行上的其他地方后跟一个空格的字符串'test',那么这仍然无法正常工作。

最后,awk可以完成这项工作但你需要遍历每个项目或将RS设置为空白区域:

选项1:

awk '{for(i=1;i<=NF;i++)if(tolower($i) ~ /test.*[0-9]/)print $i}'

选项2:

awk 'tolower($i) ~ /test.*[0-9]/' RS="[[:space:]]+"

答案 2 :(得分:0)

awk '/test2/{sub(/"/,"")}$0{print $4}/test2/{print $2}' file

TEST/VPNGW/11040

test2-VPNGW-110642