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

처음 두 개는 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" {} \;

와일드카드가 충분하지 않으면 -regexfind의 옵션을 사용할 수 있습니다.

관련 정보