ProgramingTip

grep은 검색 할 수있는 패턴과 일치하는 단어 만 표시 할 수 있습니까?

bestdevel 2020. 10. 3. 09:41
반응형

grep은 검색 할 수있는 패턴과 일치하는 단어 만 표시 할 수 있습니까?


검색 배열과 일치하는 파일에서 grep 출력 "단어"를 만드는 방법이 있습니까?

여러 파일에서 "th"와 같은 모든 인스턴스를 사용할 수 있습니다.

grep "th" *

그러나 출력은 다음과 가변적이다.

일부 텍스트 파일은 : 고양이에 매트 매트  
일부-다른 텍스트 파일 : 빠른 갈색 여우  
아직 다른 텍스트 파일 : 나는 희망  그것을 설명 철저히 

동일한 검색을 사용하여 출력하려는 ​​내용은 다음과 가변적입니다.

the
the
the
this
thoroughly

grep을 사용하여 가능합니까? 아니면 다른 도구 조합을 사용하십니까?


grep -o 시도

grep -oh "\w*th\w*" *

편집 : Phil의 의견에서 일치

에서 워드 프로세서 :

-h, --no-filename
    Suppress the prefixing of file names on output. This is the default
    when there is only  one  file  (or only standard input) to search.
-o, --only-matching
    Print  only  the matched (non-empty) parts of a matching line,
    with each such part on a separate output line.

교차 배포 안전 답변 (Windows minGW 포함?)

grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"

-o 옵션을 포함하지 않는 이전 버전의 grep (2.4.2와 같은)를 사용하는 경우. 위를 사용하십시오. 라이선스 더 간단한 버전을 사용하여 아래 버전을 유지하십시오.

Linux 교차 배포 안전한 답변

grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'

-oh출력 을 요약 하면 정규식이 파일 내용 (파일 이름이 아님)과 일치하는 결과를 출력합니다. 정규식이 vim / etc에서 작동하는 방식과 작동합니다. 검색 할 단어 또는 정규식은 다음과 가변합니다. 당신! Perl 구문이 아닌 POSIX를 사용하는 한 (아래 참조)

grep 매뉴얼에서 더보기

-o      Print each match, but only the match, not the entire line.
-h      Never print filename headers (i.e. filenames) with output lines.
-w      The expression is searched for as a word (as if surrounded by
         `[[:<:]]' and `[[:>:]]';

원래 답변이 모든 사람에게 효과가없는 이유

의 사용법은 \w확장 된 "perl"구문 플랫폼마다마다. 따라서 POSIX 문자 클래스로 작업하고 grep 설치 [[:alpha:]]\w. 자세한 내용은 정규식에 대한 Wikipedia 페이지를 참조하십시오.

거기로의 POSIX 답변은 grep의 플랫폼 (원래)에 관계없이 훨씬 더 안정적입니다.

-o 옵션없이 grep을 지원하는 경우 첫 번째 grep은 관련 행을 출력하고 tr은 공백을 새 행으로 분할하고 grep은 각 행에 최종 필터링합니다.

(PS : 지금부터 대부분의 플랫폼이 있습니다.)

@AdamRosenfield 답변의 "-o"해결 방법에 대한 신용


공백을 개행 문자로 번역 한 다음 grep을 사용할 수 있습니다. 예 :

cat * | tr ' ' '\n' | grep th

다만 awk, 도구 필요없이 조합입니다.

# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly

생각보다 간단합니다. 이 시도:

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' filename.txt  ### (Case Insensitive)

어디,

 egrep: Grep will work with extended regular expression.
 w    : Matches only word/words instead of substring.
 o    : Display only matched pattern instead of whole line.
 i    : If u want to ignore case sensitivity.

매칭 및 펄 전용 grep 명령

grep -o -P 'th.*? ' filename

나는 awk의 구문을 기억하기 어려운 것에 만족하지 못했지만이를 위해 하나의 유틸리티를 사용하는 아이디어가 마음에 들었습니다.

ack (또는 Ubuntu를 사용하는 경우 ack-grep)이이 작업을 쉽게 수행 할 수있는 것 같습니다.

# ack-grep -ho "\bth.*?\b" *

the
the
the
this
thoroughly

-h 플래그를 생략하면 다음을 얻을 수 있습니다.

# ack-grep -o "\bth.*?\b" *

some-other-text-file
1:the

some-text-file
1:the
the

yet-another-text-file
1:this
thoroughly

보너스로 --output플래그를 사용하여 내가 찾은 가장 쉬운 구문으로 더 복잡한 검색을 수행 할 수 있습니다 .

# echo "bug: 1, id: 5, time: 12/27/2010" > test-file
# ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file

1, 5, 12/27/2010

cat *-text-file | grep -Eio "th[a-z]+"

"icon-"으로 시작하는 모든 단어를 검색하려면 다음 명령이 완벽하게 작동합니다. 여기서는 grep과 비슷하지만 더 나은 옵션과 멋진 형식을 가진 Ack를 사용 하고 있습니다.

ack -oh --type=html "\w*icon-\w*" | sort | uniq

pcregrep 을 시도 할 수도 있습니다 . grep-w 옵션 있지만 경우에 따라 예상대로 작동하지 않습니다.

에서 위키 백과 :

cat fruitlist.txt
apple
apples
pineapple
apple-
apple-fruit
fruit-apple

grep -w apple fruitlist.txt
apple
apple-
apple-fruit
fruit-apple

비슷한 문제가 발생하여 grep / pattern regex 및 "일치 패턴 발견"을 출력으로 찾습니다.

결국 나는 옵션 -o와 함께 egrep (grep -e 또는 -G에 대한 동일한 정규식이 egrep의 동일한 결과를 제공하지 않음)를 사용했습니다.

그래서 (나는 정규식 마스터가 아닙니다)와 비슷한 것일 수 있다고 생각합니다.

egrep -o "the*|this{1}|thoroughly{1}" filename

다음과 같이 grep 출력을 Perl로 파이프 할 수 있습니다.

grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'

$ grep -w

grep man 페이지에서 발췌 :

-w : 전체 단어를 구성하는 일치 항목을 포함하는 행만 선택하십시오. 테스트는 일치하는 하위 문자열이 줄의 시작 부분에 있거나 단어가 아닌 구성 문자가 앞에 와야한다는 것입니다.


ripgrep

다음은 사용하는 예입니다 ripgrep.

rg -o "(\w+)?th(\w+)?"

일치하는 모든 단어와 일치 th합니다.

참고 URL : https://stackoverflow.com/questions/1546711/can-grep-show-only-words-that-match-search-pattern

반응형