我只想得到匹配的字符串(match_E2和pattern_2)以及第一列。
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预期产出可能低于
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2我尝试在-o中使用选项grep,但它只提供匹配的字符串。
发布于 2020-08-20 11:38:41
我敢说,sed可能会更好地处理您的案件。
对于match_E2模式:
$ sed -nE 's/^([^;]+).*(match_E2).*/\1,\2/p' file.txt对于pattern_2模式:
$ sed -nE 's/^([^;]+).*(pattern_2).*/\1,\2/p' file.txt对于这两种模式来说,一步一步:
$ sed -nE 's/^([^;]+).*(match_E2|pattern_2).*/\1,\2/p' file.txt也就是说,基本上:
$ 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`注意,它只依赖于至少一个;作为第一个字段和行的其余部分之间的分隔符。
发布于 2020-08-20 11:05:06
下面的awk命令应该做您想做的事情:
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中构造正则表达式,如
awk -F'[;,]' -v pat="match_E2|pattern_2" ' ... etc ... '或者运行命令两次,每种模式运行一次。
发布于 2020-08-20 13:33:59
一个更像awk版本的grep -o,使用match函数:
$ 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_2https://unix.stackexchange.com/questions/605410
复制相似问题