Linux端末のディレクトリ全体とサブディレクトリから複数行の複数の文字列をgrepする方法は?

Linux端末のディレクトリ全体とサブディレクトリから複数行の複数の文字列をgrepする方法は?

「John」AND「Riya」AND「bug」を含むパターンを一致させたいです。

例_1:

//This file should match.
Hi John, How are you?
Riya, what is your age?
Fix this bug by end of the week.

例_2:

//This file should not match.
Hi John, How are you?
Mike, what is your age?
Fix this bug by end of the week.

答え1

Foresightはこの目的のために設計されています。 PCREモードとslurpモードで-Pgrepを呼び出します-z。次に、3つの前提条件を満たす入力ファイルを一覧表示します。これにより、(?s:.....)ドットが.改行文字にまたがるようになります。

$ grep -Plz '(?s:(?=.*John)(?=.*Riya)(?=.*bug))'  file

$ grep -Plzr '(?s:.....)' .

現在のディレクトリに一致するファイルが繰り返し表示されます。

答え2

find複数のパターンを順番に使用して、-exec grep各パターンを一致させることができます。

find . -type f -exec grep -q "John" {} \; -exec grep -q "Riya" {} \; -print

find最初の失敗したテストで停止したように見えるほど悪くはありません。

答え3

私はRakesh Sharmaの解決策が好きです。 grepとawkは非常に便利です。ただし、grep範囲をはるかに超えた一致は、次のコードスニペットなどの特殊コードで処理できます。

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE:"
head $FILE

pl " Results for glark, looking for \"John\" and \"Riya\" and \"bug\":"
# glark --no-filter -a -1 John -a -1 Riya bug --end-of-and $FILE
# glark --explain -a -1 John -a -1 Riya bug --end-of-and $FILE
glark -l -a -1 John -a -1 Riya bug --end-of-and $FILE
pe " Results for glark, inverse, expecting data2:"
glark -L -a -1 John -a -1 Riya bug --end-of-and $FILE

pl " Results for greple, looking for \"John\" and \"Riya\" and \"bug\":"
greple -l --block='(?s).*' 'John Riya bug' $FILE

pl " Results for rapgrep, looking for \"John\" and \"Riya\" and \"bug\":"
rapgrep -e=John -e=Riya -e=bug $FILE
pe " Results for rapgrep, reverse, expecting data2:"
rapgrep --reverse -e=John -e=Riya -e=bug $FILE

これで以下が生成されます。

-----
 Input data file data[12]:
==> data1 <==
//This file should match.
Hi John, How are you?
Riya, what is your age?
Fix this bug by end of the week.

==> data2 <==
//This file should not match.
Hi John, How are you?
Mike, what is your age?
Fix this bug by end of the week.

-----
 Results for glark, looking for "John" and "Riya" and "bug":
data1
 Results for glark, inverse, expecting data2:
data2

-----
 Results for greple, looking for "John" and "Riya" and "bug":
data1

-----
 Results for rapgrep, looking for "John" and "Riya" and "bug":
data1
 Results for rapgrep, reverse, expecting data2:
data2

最初の2つはgrep以上の機能を持っていますが、速度のために機能を交換します。私たちの工場では、特定の機能を実行するgrepに似たコードであるrapgrepという3番目のプロジェクトを作成することにしました。 glarkセクションでコメントされた行を見ると、glarkの仕組みの詳細を見ることができます。

最初の2つを取得することに興味がある場合は、詳細については次のとおりです。

glark   Search text files for complex regular expressions, grep (local man). (doc)
Path    : /usr/local/bin/glark
Version : 1.10.5
Length  : 23 lines
Type    : Ruby script, ASCII text executable
Shebang : #!/usr/bin/ruby2.1
Home    : https://github.com/jpace/glark (doc)
( But possibly better installed as "gem install glark", after
( installing ruby. Can also recurse.

greple  grep with multiple keywords (man)
Path    : ~/bin/greple
Version : - ( local: RepRev =, ~/bin/greple, 2017-07-02 )
Length  : 2390 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Home    : https://github.com/kaz-utashiro/greple (doc)

rapgrep Require all patterns grep. (what)
Path    : ~/bin/rapgrep
Version : 1.2
Length  : 307 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl

頑張って...乾杯、drl

答え4

2つのファイルを考慮しexample_1.txt、以下を実行してくださいexample_2.txt

find ./ -type f -name "*1.txt" -exec grep -E "John|Riya|bug" {} \;

ワイルドカードが十分でない場合は、-regexfindのオプションを使用できます。

関連情報