【发布时间】:2011-06-20 22:54:21
【问题描述】:
以下是我尝试使用 awk 做的事情。获取匹配正则表达式的行和匹配之前的行并打印。我可以得到与正则表达式匹配的行,但不是之前的行:
awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}'
【问题讨论】:
-
假设第 3 行和第 4 行匹配正则表达式。你想让 2,3,4 出现吗?
以下是我尝试使用 awk 做的事情。获取匹配正则表达式的行和匹配之前的行并打印。我可以得到与正则表达式匹配的行,但不是之前的行:
awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}'
【问题讨论】:
我创建了以下 awk 脚本。打印匹配的行以及前 2 行。您可以从这个想法中使其更加灵活。
search.awk
{
a[0]=$0;
for(i=0;i<2;i++)
{
getline;
if(i==0){
a[1]=$0;
}
if(i==1){
if($0 ~ /message received/){
print a[0];
print a[1];
print $0;
}
}
}
}
用法:
awk '{print $0}' LogFile.log | awk -f search.awk
【讨论】:
可能有点跑题了,但我使用 belisarius 的答案创建了我自己的上述解决方案的变体,它搜索 Nth 条目,并返回该条目和上一行。
awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file
【讨论】:
使用更直接的模式搜索
gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2
【讨论】:
/abc/{if(a!="")print a;print;a="";next}
{a=$0}
【讨论】:
为什么不使用grep -EB1 '^CGCGGCTGCTGG'
awk 做同样的事情很啰嗦,见 Marco 的回答。
【讨论】:
在这种情况下,您可以使用 grep 轻松解决它:
grep -B1 foo file
但是,如果您需要使用 awk:
awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file
【讨论】: