"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
처음 두 개는 grep 이상의 기능을 가지고 있지만 속도를 위해 기능을 교환합니다. 우리 공장에서는 특정 기능을 수행하는 grep과 유사한 코드인 rapgrep이라는 세 번째 프로젝트를 제작하기로 결정했습니다. glark 섹션에서 주석 처리된 행을 보면 glark 작동 방식에 대한 세부 정보를 볼 수 있습니다.
처음 두 개를 얻는 데 관심이 있는 경우 자세한 내용은 다음과 같습니다.
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의 옵션을 사용할 수 있습니다.