我正试图找到一种方法,如何在特殊字符和其他单词之间提取一个单词。
案文示例:
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=""; ...
进行打印的方法无效,因为整个单词并不总是在同一位置。
感谢您的帮助!
答案 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