「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モードで-P
grepを呼び出します-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" {} \;
ワイルドカードが十分でない場合は、-regex
findのオプションを使用できます。