は、いずれかのライン上の両方
path
とredirect
を持つファイルを探して、私はbashの端子を使用していgrep a file, but show several surrounding lines?で見てきた
付近の行に
flash
があります。先頭から5行以内
これはgrep、ag、Perl、sed、またはあなたが知っているツールで可能ですか?
は、いずれかのライン上の両方path
とredirect
を持つファイルを探して、私はbashの端子を使用していgrep a file, but show several surrounding lines?
で見てきた
付近の行にflash
があります。先頭から5行以内
これはgrep、ag、Perl、sed、またはあなたが知っているツールで可能ですか?
簡単なフィルタは、「フラッシュ」が付いたフィルタです。最初に行うこともお勧めです。これにより、より高価なパターンマッチングがマッチしたファイルのサブセットで行われます。このため
、ちょうど言う:
grep -RH -C 5 "text" *
これます再帰的に(-R
)パターン「テキスト」を探し、ファイル(-H
)の名前を印刷するこの問題が発生したとき。また、周囲の5行(-C 5
)を印刷します。必要に応じて変数を5
に変更してください。
そして、2つのパターンを確認するためのawkを使用する時間です:
awk '/pattern1/ && /pattern2/ {print FILENAME}' file
これはawk is quite good on multiple patterns matchingとして有用です。
我々は、ファイル名が、フォームfilename:flash
などのストリームを持っていないので、我々はgrep
から結果処理するための基本的なバッシュループ持つことができます。これは、それよりも少し複雑です
while IFS=":" read -r filename data;
do
awk -v f="$filename" '/path/ && /redirect/ {print f}' <<< "$data"
done < <(grep -RH -C5 "text" *)
これでファイルが2回読み取られることになりますか?最初はgrepに、2番目はawkに? – Sobrique
@Sobriqueそうではありません。それは2回のパスを行いますが、2回目のパスは "text"という単語の各インスタンスを囲む10行だけを検索します。これは、 "text"がすべての1行に現れた場合、かなり非効率的になるでしょう。したがって、明らかにそれは頻繁に現れないということです。 – ThisSuitIsBlackNot
をあなたが大雑把に近い言葉を探しているからです。
だから私はおそらく、少しこのようにそれに取り組むだろう:
#!/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ラインバッファを使用します。 1つまたは他の「マッチ」に当たったときにキャプチャを開始し、2回目のマッチに当たったらプリント/フラッシュします。そして5行を超えるとバッファを空にします。
私はそれを取るステートメント修飾子が好きではない?また、 '@ buffer'に行を保存しているだけです(OPは各ファイルに合格/不合格を要求します)ので、2つのフラグを' $ buffer_limit'に設定して、ゼロ以外の再 – Borodin
ack -A6 -B4 'path.*redirect|redirect.*path' FILES | grep flash
4行前またはファイル名及びflash
を含む行の行番号と共にパターンpath
とredirect
を含むファイルFILES
の行の後に6行にパターンflash
を含む出力ライン。
ack
コマンド(またはも動作しますegrep
コマンド、)がなければ、あなたが近くにありますどのように近い2つのgrep
コマンド
(grep -A6 -B4 'path.*redirect' FILES ; grep -A6 -B4 'redirect.*path' FILES) |
grep flash
としてこれを言い換えることができますか? – ThisSuitIsBlackNot
+/- 5行が近いです....私は近道のために指定できるパラメータをツールが受け入れることを望んでいます –
"path"と "redirect"は同じ行に表示されていますか? – fedorqui