한 줄에서 여러 문자열 찾기

한 줄에서 여러 문자열 찾기

저는 Unix를 처음 접했고 CygWIN64 에뮬레이터를 사용하고 있습니다. 특정 문자열을 검색하는 데 필요한 텍스트 파일(수만 개)이 많습니다. 나는 단일 문자열을 사용하여 검색하는 방법을 성공적으로 배웠지만 며칠 동안 시도한 후에도 두 문자열을 검색하는 방법을 알 수 없습니다.

내 파일은 다음 위치에 있습니다.c:/BF/data/

내 단일 문자열 명령은 다음과 같습니다

grep -Rinw c:/BF/data/ -e 'string'

온라인 예제를 많이 시도했지만 두 문자열을 처리하는 명령을 얻을 수 없습니다(OR 구조가 아닌 AND 구조). 이 두 문자열이 한 줄에 나타나면 해당 줄이 화면에 표시되기를 원합니다. 이번에도 끈 하나로 이 작업을 수행할 수 있었습니다. 문자열에 공백이 있을 수 있습니다(이로 인해 차이가 발생하는 경우). 예를 들어 한 문자열은 "Miami"이고 다른 문자열은 "New York City"일 수 있습니다.

grep다른 명령을 시도했지만 awk아무것도 작동하지 않습니다.

누군가 나에게 올바른 방향을 알려줄 수 있습니까?

답변1

한 줄에서 2개의 문자열을 찾으려면:

Perl 호환 정규 표현식과 함께 GNU grep을 사용하십시오.

grep -RinP '^(?=.*\bMiami\b)(?=.*\bNew York City\b)' dir/

\b단어 경계 로 사용되는 Perl 정규식 .

GNU awk 사용:

gawk -v IGNORECASE=1 '
    /\<Miami\>/ && /\<New York City\>/ {
        print FILENAME ":" NR ":" $0
    }
' file

확장 정규식은 단어 경계로 \<및 를 사용합니다.\>

그러나 awk에 해당하는 항목은 없습니다 -R. find를 사용할 수 있습니다.

find dir/ -type f -exec gawk -v IGNORECASE=1 '...' '{}' +

답변2

다음 해결 방법은 @Campa가 제공한 @steeldriver가 링크한 게시물에서 찾을 수 있습니다.

grep -Rinw Miami . | grep -iw "new york city"

재귀적인 검색 및 출력을 얻으려면 스위치를 추가하기만 하면 됩니다.

사용

Miami banana
Miami New York City
Miami banana
New York City banana
Miami banana
New York City Miami

파일이 많으면 Perl을 사용하지 않는 grep것이 좋습니다 .

time grep -Rinw Miami . | grep -iw "new york city"
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.014s
user    0m0.004s
sys     0m0.016s

time grep -RinwP Miami . | grep -iwP "new york city"
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.059s
user    0m0.060s
sys     0m0.004s

위의 내용은 @glennjackman 및 erl time에 비해 장점이 있는 것 같습니다.P

time grep -RinP '^(?=.*\bMiami\b)(?=.*\bNew York City\b)' .
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.069s
user    0m0.062s
sys     0m0.007s

동일한 검색을 1,000번 반복하면 for i in {1..1000}; do ....; done이 사실이 확인되는 것 같습니다.

P@glennjackmanerlgrep

real    0m49.276s
user    0m47.414s
sys     0m1.790s

P@캄파엘grep

real    0m42.841s
user    0m42.305s
sys     0m3.346s

@campa 심플grep

real    0m8.813s
user    0m8.837s
sys     0m3.081s

하지만 1,000회 스프린트의 승자는 @glennjackman입니다.awk

real    0m2.975s
user    0m2.259s
sys     0m0.772s

관련 정보