我有一个类似这样的文件:
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 2T对应于每个块的报头。
我想从文件中提取多个模式,并输出包含所需模式的事务。
我尝试了以下代码:
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解决方案,但它们对我也不起作用。
谢谢你的帮助!奥拉
发布于 2020-08-14 05:17:55
在第三个选项之前使用|作为分隔符,就像第二个选项一样。
grep -E 't|u 0 1 2|u 0 2 2' file.txt此外,指定文件名并通过管道将ps传递给grep也是没有意义的。如果您提供文件名参数,它不会从管道读取(除非您使用-作为文件名)。
发布于 2020-08-14 05:14:16
可以将grep与多个-e表达式一起使用,以便一次执行多个grep操作:
$ printf '%d\n' {0..10} | grep -e '0' -e '5'
0
5
10发布于 2020-08-14 05:54:15
在@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[@]}"您可能需要在循环中使用一个条件来检查该行是否是您想要搜索的行,但仅此而已。
https://stackoverflow.com/questions/63403230
复制相似问题