高级grep unix

通常,grep命令用于显示包含指定模式的行。 有什么方法可以在包含指定模式的行之前和之后显示n行?

这可以通过awk实现吗?


是的,使用

grep -B num1 -A num2 

在匹配之前包括num1行上下文,以及在匹配之后包含num2行上下文。

编辑:

似乎OP正在使用AIX。 这有一组不同的选项,不包括-B和-A

这个链接描述了AIX 4.3上的grep(它看起来没有希望)

马特的Perl脚本可能是一个更好的解决方案。


以下是我通常在AIX上执行的操作:

before=2  << The number of lines to be shown Before >>
after=2   << The number of lines to be shown After >>
grep -n <pattern> <filename> | cut -d':' -f1 |  xargs  -n1 -I % awk "NR<=%+$after && NR>=%-$before" <filename>

如果你不想要额外的2个变量,你可以使用它一行:

grep -n <pattern> <filename> | cut -d':' -f1 |  xargs  -n1 -I % awk 'NR<=%+<<after>> && NR>=%-<<before>>' <filename>

假设我有一个模式'堆栈'和文件名是flow.txt我想要2行之前和3行之后。 该命令将如下所示:

grep -n 'stack' flow.txt | cut -d':' -f1 |  xargs  -n1 -I % awk 'NR<=%+3 && NR>=%-2' flow.txt

我只需要2行,命令如下所示:

grep -n 'stack' flow.txt | cut -d':' -f1 |  xargs  -n1 -I % awk 'NR<=% && NR>=%-2' flow.txt

我只需要3行,命令如下所示:

grep -n 'stack' flow.txt | cut -d':' -f1 |  xargs  -n1 -I % awk 'NR<=%+3 && NR>=%' flow.txt

多个文件 - 将其更改为Awk&grep。 从上面的模式'堆'与文件名是流。* - 前2行和后3行。 该命令将如下所示:

    awk 'BEGIN { 
    before=1; after=3; pattern="stack";
    i=0; hold[before]=""; afterprints=0}
    { 
    #Print the lines from the previous Match
    if (afterprints > 0)
      {
      print FILENAME ":" FNR ":" $0
      afterprints-- #keep a track of the lines to print after - this can be reset if a match is found
      if (afterprints == 0) print "---"
      }
    #Look for the pattern in current line
    if ( match($0, pattern) > 0 )
      {
      # print the lines in the hold round robin buffer from the current line to line-1
      #  if (before >0)  => user wants lines before avoid divide by 0 in %
      #  and afterprints => 0 - we have not printed the line already
      for(j=i; j < i+before && before > 0 && afterprints == 0 ; j++)
        print hold[j%before]
      if (afterprints == 0) #  print the line if we have not printed the line already
        print FILENAME ":" FNR ":" $0
      afterprints=after
      }
    if (before > 0) # Store the lines in the round robin hold buffer
      { hold[i]=FILENAME ":" FNR ":" $0
        i=(i+1)%before }
  }' flow.*

从标签来看,很可能系统有一个可能不支持提供上下文的grep(Solaris是一个不支持而我不记得AIX的系统)。 如果是这种情况,那么可以在http://www.sun.com/bigadmin/jsp/descFile.jsp?url=descAll/cgrep__context_grep上找到一个perl脚本。

链接地址: http://www.djcxy.com/p/19631.html

上一篇: Advanced grep unix

下一篇: return surrounding lines for each hit