전체 줄이 일치하는 경우에만 grep을 일치시키는 방법은 무엇입니까?
나는 이것들이있다 :
$ 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을 사용하여 원하는 것을 얻을 수 있습니까?
regexp 앵커를 지정하기 만하면됩니다.
grep '^ABB\.log$' a.tmp
grep -Fx ABB.log a.tmp
grep man 페이지에서 :
-F, --fixed-strings
PATTERN을 고정 문자열 (목록)로 해석합니다.
-x, --line-regexp
전체 행과 정확히 일치하는 일치 항목 만 선택합니다.
앵커를 사용하는 것이 가장 좋은 방법이지만 내가하는 일은 다음과 같습니다.
grep -w "ABB.log " a.tmp
비슷하게 awk
awk '/^ABB\.log$/' file
대부분의 제안은 선행 또는 후행 공백이 너무 많으면 실패하며 파일을 직접 편집하는 경우 중요합니다. 이 경우에는 덜 민감하게됩니다.
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
OP 시도 및 기타 답변에 대한 추가 설명을 추가하려고합니다.
John Kugelmans의 솔루션 도 다음과 같이 사용할 수 있습니다 .
grep -x "ABB\.log" a.tmp
문자열을 인용하고 점 ( .
)을 이스케이프하면 -F
더 이상 플래그 가 필요하지 않습니다 .
.
(점) 을 이스케이프해야합니다 (이스케이프 되지 않은 경우 모든 문자 와 일치하기 때문에 (뿐만 아니라 .
)) -F
grep과 함께 플래그를 사용해야합니다 . -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
노트 :
-x
전체 라인과 일치하는 힘.- 이스케이프
.
되지 않은-F
플래그를 사용하는 답변 은 잘못되었습니다. -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
이것은 비슷한 일을 할 때 잘 작동했습니다.
grep -F ABB.log a.tmp
$ 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
$
나를 위해 작동 :
grep "\bsearch_word\b" text_file > output.txt
\b
경계를 표시 / 설정합니다.
꽤 빨리 작동하는 것 같습니다
이것은 HPUX의 경우입니다. 파일의 내용에 단어 사이에 공백이 있으면 다음을 사용하십시오.
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
나는 선호한다 :
str="ABB.log"; grep -E "^${str}$" a.tmp
건배
I needed this feature, but also wanted to make sure I did not return lines with a prefix before the ABB.log:
- ABB.log
- ABB.log.122
- ABB.log.123
- 123ABB.log
grep "\WABB.log$" -w a.tmp
참고URL : https://stackoverflow.com/questions/4709912/how-to-make-grep-only-match-if-the-entire-line-matches
'Programing' 카테고리의 다른 글
JAX-RS의 공급자는 무엇을 의미합니까? (0) | 2020.08.30 |
---|---|
ASP.NET MVC의 ViewBag 작동 방식 (0) | 2020.08.30 |
신속하게 줄 바꿈없이 인쇄 (0) | 2020.08.29 |
반올림하지 않고 소수점 두 자리 자르기 (0) | 2020.08.29 |
EditText에서 오류 제거 (0) | 2020.08.29 |