如何解决用grep选择多个模式
我有一个看起来像这样的文件:
t # 3-7,1
v 0 104
v 1 92
v 2 95
u 0 1 2
u 0 2 2
u 1 2 2
t # 3-8,1
v 0 94
v 1 13
v 2 19
v 3 5
u 0 1 2
u 0 2 2
u 0 3 2
t # 3-9,1
v 0 94
v 1 13
v 2 19
v 3 7
u 0 1 2
u 0 2 2
u 0 3 2
t对应于每个块的标题。
我想从文件中提取多个模式,并输出完全包含所需模式的事务。
我尝试了以下代码:
ps | grep -e 't\|u 0 1 2' file.txt
,它很好地提取了标头和模式'u 0 1 2'。但是,当我再添加一个模式时,仅输出列表的标头以t#开头。我修改后的代码如下:
ps | grep -e 't\|u 0 1 2 && u 0 2 2' file.txt
我尝试了sed和awk解决方案,但它们对我也不起作用。
谢谢您的帮助! 欧拉(Olha)
解决方法
您可以将grep与多个-e
表达式一起使用,一次将grep用于一件事情:
$ printf '%d\n' {0..10} | grep -e '0' -e '5'
0
5
10
,
与第二种选择一样,在第三种选择之前使用|
作为分隔符。
grep -E 't|u 0 1 2|u 0 2 2' file.txt
此外,指定文件名并将ps
传递到grep
也没有意义。如果提供文件名参数,则不会从管道中读取该文件名(除非您将-
用作文件名)。
在@kojiro's answer上展开,您将需要use an array to collect arguments:
mapfile -t lines < file.txt
for line in "${lines[@]}"
do
arguments+=(-e "$line")
done
grep "${arguments[@]}"
您可能需要在循环中使用一个条件来检查该行是否是您要搜索的行,仅此而已。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。