awk 打印匹配行和匹配之前的行

发布于 2024-10-15 22:52:45 字数 151 浏览 1 评论 0原文

以下是我尝试使用 awk 执行的操作。获取与正则表达式匹配的行以及紧邻匹配项之前的行并打印。我可以得到与正则表达式匹配的行,但不能得到紧接其之前的行:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 

Following is what I am trying to do using awk. Get the line that matches the regex and the line immediately before the matched and print. I can get the line that matched the regex but not the line immediately before that:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

孤蝉 2024-10-22 22:52:45

在这种情况下,您可以使用 grep 轻松解决它:

grep -B1 foo file

但是,如果您需要使用 awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file

In this case you could easily solve it with grep:

grep -B1 foo file

However, if you need to to use awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file
蓝梦月影 2024-10-22 22:52:45
/abc/{if(a!="")print a;print;a="";next}
{a=$0}
/abc/{if(a!="")print a;print;a="";next}
{a=$0}
染柒℉ 2024-10-22 22:52:45

使用更直接的模式搜索

gawk '{if (/^abc$/) {print x;打印 $0};x=$0}' file1 >文件2

use more straightforward pattern search

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

歌枕肩 2024-10-22 22:52:45

我创建了以下 awk 脚本。打印匹配行以及前两行。你可以根据这个想法让它变得更加灵活。

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

I created the following awk script. Prints the matching line as well as the previous 2 lines. You can make it more flexible from this idea.

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;
            }
       }
    }
}

Usage:

awk '{print $0}' LogFile.log | awk -f search.awk
恏ㄋ傷疤忘ㄋ疼 2024-10-22 22:52:45

为什么不使用 grep -EB1 '^CGCGGCTGCTGG' 使用

awk 来做同样的事情非常冗长,请参阅 Marco 的回答。

Why not use grep -EB1 '^CGCGGCTGCTGG'

The awk to do the same thing is very long-winded, see Marco's answer.

夜血缘 2024-10-22 22:52:45

也许有点偏离主题,但我使用贝利撒留的答案创建了我自己的上述解决方案的变体,该变体搜索Nth条目,并返回该条目和上一行。

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file

Maybe slightly off-topic, but I used the answer from belisarius to create my own variation of the above solution, that searches for the Nth entry, and returns that and the previous line.

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文