저는 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
파일이 많으면 P
erl을 사용하지 않는 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