awk 特定文本并在上面打印 2 行

Posted

技术标签:

【中文标题】awk 特定文本并在上面打印 2 行【英文标题】:awk specfic text and print 2 lines above 【发布时间】:2021-06-05 13:15:25 【问题描述】:

我有一个文件,我需要使用 awk 在匹配结果上方 2 行。我整理了以下内容,到目前为止一切都很好,但是我想使用匹配大小写进行搜索:

#cat data.out
 unload file name = dupli00913.unl number of rows = 251 

create table vodac.duplicall2
 unload file name = dupli01608.unl number of rows = 0 

create table vodac.duplicall

我用来实现我想要的命令如下:

cat data.out | awk "/create table vodac.duplicall/for(i=1;i<=x;)print a[i++];print for(i=1;i<x;i++)a[i]=a[i+1];a[x]=\$0;"  x=2 | head -1 | awk 'print $6' 

上面给了我以下:

dupli00913.unl

输出命令给了我我需要的东西,但必须是“duplicall”表而不是“duplicall2”。如何在我的命令中实现这一点以匹配特定于大小写的字符串?

【问题讨论】:

您的grep 命令是否支持-B 选项?这会比 awk 更容易 【参考方案1】:

对于您显示的示例,您能否尝试以下操作。用 GNU awk 编写和测试。

tac Input_file | 
awk '
  /create table vodac\.duplicall$/
    found=1
    next
  
  found && ++count==2
    print
    exit
'

说明:为上述添加详细说明。

tac Input_file |                        ##Using tac Input_file to print lines in reverse order(from last line to first line).
awk '                                   ##Sending tac command output to awk program here.
  /create table vodac\.duplicall$/     ##Checking condition if line contains create table vodac\.duplicall here.
    found=1                             ##If above condition is TRUE then set found to 1 here.
    next                                ##next will skip all further statements from here.
  
  found && ++count==2                  ##Checking condition if found is SET and count is 2 then do following.
    print                               ##Printing current line here.
    exit                                ##exiting from program from here.
'

【讨论】:

@ChristopherKarsten,它给了我 unload file name = dupli01608.unl number of rows = 0 预期的输出,如果这就是你现在所期望的,请告诉我?谢谢。 抱歉。这是工作。我用猫代替了tac。以为可能是打字错误 @ChristopherKarsten,您的欢迎、欢呼和快乐的学习。【参考方案2】:

如果你想用“awk”显示这行和上面的两行,我不知道。

如果要显示该行和上面的两行,可以这样做:

grep -n 2 "text" <filename> | head -n 3

在该行中,“grep -n 2”显示该行及其周围的两行,“head -n 3”显示后者的前三行。

【讨论】:

以上是关于awk 特定文本并在上面打印 2 行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

Linux文本处理神器awk实战案例

在另一个文本文件中存在的文本之后打印特定行

linux(39):shell 打印偶数行,奇数行 ,行号

shell awk 的一些用法

匹配成功后 awk 打印“匹配”