-4

我一直在查看grep 文件,但显示了几行?

我正在使用 bash 终端,正在寻找一个文件

  • 两者都有path,并且redirect在任何一条线上

  • 在附近flash的一条线上,距离第一条线不到五线

在这可能使用 grep、ag、Perl、sed 或你们知道的任何工具?

4

3 回答 3

1

更简单的过滤器是带有“flash”的过滤器。最好先做,这样更昂贵的模式匹配在匹配文件的子集中完成。

为此,只需说:

grep -RH -C 5 "text" *

这将递归地 ( -R) 查找模式“文本”并在发生这种情况时打印文件的名称 ( -H)。此外,它将打印周围的 5 行 ( -C 5)。5如果需要,只需更改变量即可。

然后是时候使用 awk 来检查两种模式:

awk '/pattern1/ && /pattern2/ {print FILENAME}' file

这很有用,因为awk 在多个模式匹配上非常好

由于我们没有文件名,而是表单上的流filename:flash等,我们可以有一个基本的 Bash 循环来处理来自grep

while IFS=":" read -r filename data;
do
    awk -v f="$filename" '/path/ && /redirect/ {print f}' <<< "$data"
done < <(grep -RH -C5 "text" *)
于 2017-01-18T16:21:36.183 回答
1
ack -A6 -B4 'path.*redirect|redirect.*path' FILES | grep flash

输出包含模式flash的文件中包含模式的行之前的 4 行或之后的 6 行中FILES包含模式的行pathredirect以及文件名和包含flash.

如果没有ack命令(或egrep也可以使用的命令),您可以将其改写为两个grep命令

(grep -A6 -B4 'path.*redirect' FILES ; grep -A6 -B4 'redirect.*path' FILES) |
    grep flash
于 2017-01-18T16:29:34.520 回答
0

这比看起来要复杂一些,因为您正在寻找大致接近的单词。

所以我可能会像这样处理它:

#!/usr/bin/env perl

use strict;
use warnings;

my $buffer_limit = 5; # +/- 5

my @buffer; 

my $first_flag;
my $second_flag; 

#iterate stdin or files specified on command line
while ( my $line = <> ) {

   #test first condition
   if ( $line =~ m/path/ and $line =~ m/redirect/ ) { $first_flag++; };
   #test second condition
   if ( $line =~ m/flash/ ) { $second_flag++; };

   #if either is true - match has been seen recently. 
   #save the line in the buffer. 
   if ( $first_flag or $second_flag ) { 
         push @buffer, $line
   }
   #if both are true, we print (and flush the buffer)
   if ( $first_flag and $second_flag ) { 
       print "Match found up to line $.:\n";
       print @buffer;
       @buffer = ();
       $first_flag = 0;
       $second_flag = 0; 
   }
   #exceeding limit means that both matches haven't been seen in proximity. 
   if ( @buffer > $buffer_limit ) { 
      @buffer = ();
      $first_flag = 0;
      $second_flag = 0;
   }
}

我们使用滚动 5 行缓冲区。当我们击中一个或其他“匹配”时,我们开始捕获,如果我们击中第二个匹配,我们将打印/刷新。如果超过 5 行,则清空缓冲区。

于 2017-01-18T16:24:29.860 回答