Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用grep选择多个模式_Bash_Grep - Fatal编程技术网

Bash 使用grep选择多个模式

Bash 使用grep选择多个模式,bash,grep,Bash,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 ps | grep -e 't\|u 0 1 2 && u 0 2 2' file.txt t对应

我有这样的文件:

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
ps | grep -e 't\|u 0 1 2 && u 0 2 2' file.txt 
t对应于每个块的标题

我想从文件中提取多个模式,并输出包含所需模式的事务

我尝试了以下代码:

ps | grep -e 't\|u 0 1 2' file.txt 
它可以很好地提取标题和模式“u012”。但是,当我再添加一个模式时,仅输出列表的标题以t开头。我修改过的代码如下所示:

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
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表达式一起使用,一次对多个内容进行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也没有意义。如果您提供文件名参数,它不会从管道中读取,除非您使用-作为文件名。

在第三个选项之前使用|作为分隔符,就像第二个选项一样

grep -E 't|u 0 1 2|u 0 2 2' file.txt
另外,指定一个文件名并将ps传输到grep也没有意义。如果提供文件名参数,则除非使用-作为文件名,否则它不会从管道中读取。

继续展开,您需要:

您可能需要在循环中设置一个条件来检查该行是否是您要搜索的行,但仅此而已。

继续展开,您需要:


您可能需要在循环中设置一个条件来检查该行是否是您要搜索的行,但仅此而已。

为什么要使用&&而不是\|像添加第二个模式时那样?@anubhava t行上没有0 1 2。啊,没错,在这种情况下grep-E'u 0[12]2 | t‘你为什么用&&而不是像你添加第二个图案时那样?@anubhava t线上没有0 1 2。啊,没错,在这种情况下grep-E'u 0[12]2 | t’所以,这给了我两个选项,t3-436,u0 1 2,u0 2和t3-437,u0 1 2。我怎样才能保持精确匹配,即仅t 3-436,u 0 1 2,u 0 2 2?你的意思是,如果该块中有u线匹配,你只需要t线?我不认为你能用grep做到这一点,你需要像awk这样可编程的东西。所以,这给了我两个选项,t3-436,u01-2,u02和t3-437,u01-2。我怎样才能保持精确匹配,即仅t 3-436,u 0 1 2,u 0 2 2?你的意思是,如果该块中有u线匹配,你只需要t线?我不认为你能用grep做到这一点,你需要像awk这样可编程的东西。