首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将grep字符串与第一列匹配?

如何将grep字符串与第一列匹配?
EN

Unix & Linux用户
提问于 2020-08-20 10:23:01
回答 6查看 1.9K关注 0票数 2

我只想得到匹配的字符串(match_E2pattern_2)以及第一列。

代码语言:javascript
复制
abcd.corp;;a123,Virtual,aws,Linux,Linux,match_E2,Database
web1.corp;;,Virtual,azure,match_E2,Linux,corpo,Database
web2.corp;;match_E2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_2,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database

预期产出可能低于

代码语言:javascript
复制
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2

我尝试在-o中使用选项grep,但它只提供匹配的字符串。

EN

回答 6

Unix & Linux用户

回答已采纳

发布于 2020-08-20 11:38:41

我敢说,sed可能会更好地处理您的案件。

对于match_E2模式:

代码语言:javascript
复制
$ sed -nE 's/^([^;]+).*(match_E2).*/\1,\2/p' file.txt

对于pattern_2模式:

代码语言:javascript
复制
$ sed -nE 's/^([^;]+).*(pattern_2).*/\1,\2/p' file.txt

对于这两种模式来说,一步一步:

代码语言:javascript
复制
$ sed -nE 's/^([^;]+).*(match_E2|pattern_2).*/\1,\2/p' file.txt

也就是说,基本上:

代码语言:javascript
复制
$ sed -nE 's/^([^;]+).*(    ).*/\1,\2/p' file.txt
#                       ^  ^
#                       |  |
#            ---------------------
# put within these two parentheses the same (Extended Regular Expression) pattern you would use with `grep -E`

注意,它只依赖于至少一个;作为第一个字段和行的其余部分之间的分隔符。

票数 5
EN

Unix & Linux用户

发布于 2020-08-20 11:05:06

下面的awk命令应该做您想做的事情:

代码语言:javascript
复制
awk -F'[;,]' -v pat="match_E2" '$0~pat{for (i=3;i
  • -F'[;,]'选项将告诉awk将;和,识别为字段分隔符,并相应地分割行。注意,虽然POSIX标准要求这样的多字符字段分隔符被解释为完整的正则表达式,但是仍然可能有一些awk版本没有正确地实现这一点。
  • 模式通过-v pat="match_E2"命令行选项传递给awk。请注意,这将将模式解释为完全正则表达式。如果你有字符在这个上下文中有一个特殊的意义,你需要转义他们!
  • 如果当前行与模式匹配($0 ~ pat的意思是“如果整个行与存储在pat中的正则表达式匹配”),则它将遍历所有相关字段(字段3是上一个;之后的第一个字段),并标识实际匹配的字段( if ($i ~ pat)条件)。然后通过$1打印第一个字段($i)和匹配字段(D19)。这假设在匹配线上只能有一个这样的字段!

如果您查找多个模式,则可以相应地在pat中构造正则表达式,如

代码语言:javascript
复制
awk -F'[;,]' -v pat="match_E2|pattern_2" ' ... etc ... '

或者运行命令两次,每种模式运行一次。

票数 4
EN

Unix & Linux用户

发布于 2020-08-20 13:33:59

一个更像awk版本的grep -o,使用match函数:

代码语言:javascript
复制
$ awk -F';' 'match($0,/match_E2|pattern_2/) {print $1 "," substr($0,RSTART,RLENGTH)}' file
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/605410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档