我如何使用bash来过滤多个模式和一行之前只有模式?



我有一个多行文件:

line1
line2
line3
line_before
line4
line5
line6

和3种模式:

line2
line4
line6

:

line2
line_before
line4
line6

我尝试使用grep -B 1,但它在任何模式之前显示行。

谢谢你的帮助!

With awk…

在我的例子中,你的多行文件被命名为"file.txt";有3个图案的文件为filem.txt

awkfilter.awk程序:

#! /bin/awk -f
NR == FNR && NR != 2 {
# First file: Save 1st en 3rd tokens
m[$0]=1
next
}
NR == FNR && NR == 2 {
# First file: Save 2nd token
b[$0]=1
next
}
NR != FNR {
# Second file
# Search line in tokens
for (e in m) {
if ($0 == e) {
# Print current line
print
old = $0
next
}
}
for (e in b) {
if ($0 == e) {
# Print previous line
if (FNR > 1) print prev
# Print current line
print
old = $0
next
}
}
}
{
# Save current line
prev = $0
}

像这样执行(文件顺序很重要):

awk -f filter.awk filem.txt file.txt

输出:

line2
line_before
line4
line6

我假设你想要-B1-e line4。(我将其表述为:">我如何搜索多个模式,包括只有一个模式之前的行?")

关于grep -zPo的建议:

grep -zPo 'vK(line[26]|V*vline4)(?=v)' file

或(相同的正则表达式,不同的语法):

grep -zPo '(?<=v)(line[26]|V*vline4)(?=v)' file

都输出如下:

line2
line_before
line4
line6

解释:

  • -z:占用整个文件
  • -P支持perl正则表达式
  • -o:只输出匹配的字符串(一次一行)
  • v:垂直空白字符
  • vK(?<=v):在匹配前需要垂直空白,但不包括在match
  • (?=v):匹配后需要垂直空白,但不包括在匹配
  • V*vline4:对于line4模式,包括前面的行(所有非垂直空白字符,换行符,然后匹配行)来模拟grep -B1 line4

相关内容

  • 没有找到相关文章

最新更新