전체 줄이 일치하는 경우에만 grep을 일치시키는 방법은 무엇입니까?


103

나는 이것들이있다 :

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

ABB.log와 정확히 일치하는 것을 찾고 싶었습니다.

하지만 내가했을 때

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

모두 보여줍니다.

grep을 사용하여 원하는 것을 얻을 수 있습니까?

답변:


105

regexp 앵커를 지정하기 만하면됩니다.

grep '^ABB\.log$' a.tmp

2
두 앵커 (^ 및 $)가 필요합니다.
user562374

2
잘 했어! 그리고 파일에서 일치하는 정규식을 사용하고 있다면? "grep -f 패턴 a.tmp"??
green69

@ green69 몇 년 늦었지만 패턴을 grep에 전달하기 전에 sed를 사용하여 앵커를 추가 할 수 있습니다.sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Randoms

155
grep -Fx ABB.log a.tmp

grep man 페이지에서 :

-F,-고정 문자열
PATTERN을 고정 문자열 (목록)로 해석합니다.
-x, --line-regexp
전체 행과 정확히 일치하는 일치 항목 만 선택합니다.


2
불행히도 -F를 사용할 수 없었습니다.
Johnyy

@Johnyy 아니 -F? Solaris에 있습니까? 그렇다면 사용/usr/xpg4/bin/grep
Scrutinizer 2013 년

9
나는 사용하고있다 grep bash 스크립트 내부에서 하고 있으며이 옵션은 수락 된 답변에서 제안한 정규식을 사용하는 것보다 낫습니다. 변수 내에 특수 문자가 있기 때문에 (예 :) 검색 .중이며 명령을 사용할 때 이스케이프 할 필요가 없습니다.
Gustavo Straube 2015 년

1
이스케이프하지 않고 특수 문자를 허용하기 때문에 베스트 답변 IMO
ReneGAED

1
이것은 변수와 함께 작동하기 때문에 더 좋습니다.
이벤 지라

23

앵커를 사용하는 것이 가장 좋은 방법이지만 내가하는 일은 다음과 같습니다.

grep -w "ABB.log " a.tmp

이와 같이 .. 첫 번째 줄 일치를 반환합니다
user765443

1
이것은 ABB.log일반적인 경우가 아닌 뒤에 공백이 필요합니다. 즉, 대부분의 경우 실패합니다.
Jahid

3

대부분의 제안은 선행 또는 후행 공백이 너무 많으면 실패하며 파일을 직접 편집하는 경우 중요합니다. 이 경우에는 덜 민감하게됩니다.

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

쉘의 간단한 while-read 루프는이를 암시 적으로 수행합니다.

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp


1

OP 시도 및 기타 답변에 대한 추가 설명을 추가하려고합니다.

John Kugelmans의 솔루션 도 다음과 같이 사용할 수 있습니다 .

grep -x "ABB\.log" a.tmp

문자열을 인용하고 점 ( .)을 이스케이프하면 -F더 이상 플래그 가 필요하지 않습니다 .

.(점) 을 이스케이프해야합니다 (이스케이프 되지 않은 경우 모든 문자 와 일치하기 때문에 (뿐만 아니라 .)) -Fgrep과 함께 플래그를 사용해야합니다 . -F플래그는 고정 문자열 (정규식 아님)을 만듭니다.

문자열을 인용하지 않는 경우 점 ( .) 을 이스케이프하기 위해 이중 백 슬래시가 필요할 수 있습니다 .

grep -x ABB\\.log a.tmp


테스트:

$ echo "ABBElog"|grep -x  ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x  "ABB\.log"
#returns empty string, no match


노트 :

  1. -x 전체 라인과 일치하는 힘.
  2. 이스케이프 .되지 않은 -F플래그를 사용하는 답변 은 잘못되었습니다.
  3. -x패턴 문자열을 ^및 로 래핑하여 전환을 피할 수 있습니다 $. 이 경우 제조업체에 확인 당신이 사용하지 않는 -F탈출 대신 .하기 때문에, -F의 정규식 해석을 방지 ^하고 $.


편집 : (@hakre에 대한 추가 설명 추가) :

로 시작하는 문자열을 일치 시키려면 grep과 함께 -사용해야합니다 --. 다음 --은 입력으로 간주됩니다 (옵션 아님).

예:

echo -f |grep -- "-f"     # where grep "-f" will show error
echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename

-F가 귀하의 경우에 누락 된 것을 실제로 경험 했습니까? 그렇다면 어떤 경우인지 말씀해 주시겠습니까?
hakre

@hakre 내 대답을 완전히 읽었습니까? 나는 제대로 탈출 -F하면 왜 필요하지 않을지 (아주 분명하게) 설명했습니다 ..
Jahid

확실한. 물론입니다.이 -F글을 작성할 때 사용할 수 있었 나요? 그렇지 않다면 어떤 시스템을 사용하고 계셨습니까? 지금까지 답변에서 해당 정보를 찾을 수 없었습니다. 지금도 다시 읽었습니다. 정말 확실합니다. 적어도 두 번은 귀하의 답변을 완전히 읽었습니다. ;)
hakre 2015-08-08

@hakre 물론 -F사용 가능했습니다. (내가 -Fgrep
말했지

통찰력에 감사드립니다. 한 가지 간단한 질문 만 남았습니다. -F답이 있다면 왜 탈출에 신경을 쓰나요? 그것에 대한 당신의 의견은 무엇입니까?
hakre


-1
    $ cat venky
    ABB.log
    ABB.log.122
    ABB.log.123

    $ cat venky | grep "ABB.log" | grep -v "ABB.log\."
    ABB.log
    $

    $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
    ABB.log.122
    $

1
또한 ABB.log로 끝나는 파일과 일치하며 점은 이스케이프해야합니다.
Scrutinizer 2013 년

-1

나를 위해 작동 :

grep "\bsearch_word\b" text_file > output.txt  

\b 경계를 표시 / 설정합니다.

꽤 빨리 작동하는 것 같습니다


이것은 또한 search_word단어 경계로 구분 된 모든 행과 일치합니다 . 예를 들어, "foo search_word bar"행과 일치합니다.
Rohan Singh

-2

이것은 HPUX의 경우입니다. 파일의 내용에 단어 사이에 공백이 있으면 다음을 사용하십시오.

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp


OP는 줄 내에서 공백으로 구분 된 단어가 아니라 전체 줄과 일치하기를 원했습니다.
Keith Thompson


-3

이 기능이 필요했지만 ABB.log 앞에 접두사가있는 줄을 반환하지 않았는지 확인하고 싶었습니다.

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

grep "\WABB.log$" -w a.tmp

이것은 \W공백이 아닌 문자 인 선행 이 충족되는 경우에만 일치 하므로 xABBxlog.
bschlueter dec.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.