grep을 사용하여 줄 끝에서 패턴 감지


64

만약 내가한다면:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

.rar파일 만 나열하고 grep을 사용 하면 .rar.part파일 도 표시됩니다 . 원하는 것이 아닙니다. 이 스레드 에서 또는
사용 하여이 문제를 해결 하고 정상적으로 작동하지만을 통해 가능한지 배우고 싶습니다 . findls **/*.rargrep

나는 (에 대해 생각 EOL) 시도했다 .

ls -R | grep ".rar\n"

결과가 없습니다.
문제는 줄 끝에서 greping이 발견되는지 발견하는 데 있다고 생각 하지만 확실하지 않습니다.

도와주세요?


grep이 경우 왜 사용 하시겠습니까? 왜 안돼 find?
devnull

1
@devnull은 줄 끝에있는 패턴을 감지하는 방법을 아는 것이 많은 경우에 유용 할 수 있습니다. 예를 들어, 이식성, 너무 단순한 리눅스가 내장 된 라우터에서의 사용, Windows 용 UnxUtils에서의 사용 ( find명령이 Windows와 충돌) 및 학습 ;-). 문제는 "디렉토리에 파일 나열"(단순히 사용자 정의 예)이 아니라 "grep 명령 사용법 이해"에 관한 것입니다.
Sopalajo de Arrierez

1
솔직히 줄 끝에서 구분 기호로 계산하는 경우을 사용해야합니다 ls -1R.
mikeserv

1
그리고 당신은 필요하지 않습니다 grep. 내 대답을 참조하십시오.
mikeserv

@ mikeserv, -1R스위치 없이 일어날 수있는 일 . 분명히 결과는 같습니다.
Sopalajo de Arrierez 1

답변:


88

$앵커는 라인의 끝을 일치합니다.

ls -R | grep '\.rar$'

find이것을 위해 사용할 수도 있습니다 :

find . -name '*.rar'

나는 "."를 몰랐다 grep에서 탈출해야합니다. 와일드 카드로 취급됩니까?
thebunnyrules

1
@thebunnyrules "." 정규식에서 모든 문자 중 하나를 의미합니다.
jordanm

10

귀하의 질문 외에도 .rar".rar"와 일치 할뿐만 아니라 . .이전의 모든 단일 문자 (포함 ) 와도 일치 합니다 rar. 이 경우 아마도 문제는 아니지만 .정규 표현식에서 이스케이프해야합니다.

ls -R | grep "\.rar$"

패턴 .asc과 같은 의미 *asc입니까? 예를 들어 whereverasc.
Sopalajo de Arrierez

2
@SopalajodeArrierez 아니요, 모든 문자 그룹이 아니라 모든 단일 문자와 일치하지는 않습니다 (예 :) xrar.
Hauke ​​Laging

5

grep단어 경계에서 시작하여 문자열을 찾 도록 지시 할 수도 있습니다 . A .는 이러한 경계 중 하나입니다.

$ ls -R | grep '\brar$'

이 샘플 데이터가 있다고 가정 해보십시오.

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

이 명령은 .rar확장자가 있는 파일 만 찾습니다 .

$ ls -R | grep '\brar$'
afile.rar

어떻게 작동합니까?

메타 문자 \b는 캐럿 및 달러 기호와 같은 앵커입니다. "단어 경계"라는 위치에서 일치합니다. 이 일치는 길이가 0입니다.

이것이 작동하지 않는 상황

이름 blah-rar이 지정된 파일이 있으면이 파일도 감지됩니다.

$ ls -R | grep '\brar$'
afile-rar
afile.rar

영숫자 이외의 문자는 일반적으로 경계 문자로 간주되므로이 방법을 넘어 서기 때문입니다.


첫눈에 동일하게 보이지만 실제로는 약간 다릅니다. 감사합니다, @slm. "간단한 따옴표 대신 큰 따옴표 를 사용하면 귀찮게합니까 ?
Sopalajo de Arrierez

1
@SopalajodeArrierez-nope는 어느 쪽이든 작동합니다. 그러면 w /로 시작하는 이름을 가진 파일이 있습니다 .rar. 그러나 이것들은의 사용에 문제가되지 않습니다 ls -R. 당신이 사용하는 경우에만 ls -Ra.
slm

여러분 중 한 사람이이 작은 차이점을 대중에게 설명하고 싶습니까?
Hauke ​​Laging

@HaukeLaging 내 예제에서로 -P전환합니다 grep. 이는 인수에 대한 PCRE 해석을 트리거합니다.
slm

1
@SopalajodeArrierez-파일 \n에 유효한 문자 인 개행 문자 ( )가 포함 된 경우 . 그러면 ls -1R파일이 단일 열에 표시됩니다.
slm

0

그냥 해 :

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

당신은 전혀 필요하지 않습니다 grep.

참고 : 위의 내용은 ... 적어도 여전히afile-rar이해하고 이유를 이해하지 못한다는 점을 제외하고는 작동합니다. 나는 그것을 여기에 남겨 둘 것이다. 그러나 나는 그것을 자랑스럽게 생각하지 않는다. 어쨌든 다른 사람들이 말했듯이 :

find . '*.rar'

xrar또는 라는 파일을 차단하지 않았습니다 afile-rar.
slm

여전히 출력에 다른 파일이 있습니다.
slm

@slm 다른 파일은 무엇입니까? 나는 그들이 너무 짧은 원인 일 수 있다고 생각합니다. 방금 저 자신을 알아 차 렸습니다. 나도 그 문제를 해결했다.
mikeserv

파일 afile-rar과는 xrar여전히 출력에 포함되고있다. 최신 개조에도 아무런 변화가 없습니다. 성가신 문제 아니? 일반적인 방법없이 해결하려고 시도하는 것은 재미 있습니다. 8-)
slm

@ slm 그래, 내가 여기 온 이유입니다. 나는 왜 -dash통과 하는지 이해하지 못한다 . xrar일은 내가 처리 할 수 있지만하지 -dash.난 이해가 안 돼요-dash.
mikeserv

0

작은 따옴표를 사용하여 $를 줄 끝으로 사용하십시오. 일부 변수로 grep하려면 다음과 같이 큰 따옴표와 작은 따옴표를 조합하십시오.

grep "$var"'$'

이전 게시물이 중복되어 삭제되었습니다. 이것이 어떻게 다른지 설명하겠습니다.

다른 게시물에는 큰 따옴표의 ""전체 사용 또는 작은 따옴표의 전체 사용이 언급되어 있습니다 ''. 둘 다 자신의 한계가 있습니다. 다음은 그것을 설명합니다.

모든 큰 따옴표와 관련된 문제는 다음과 같습니다. grep "pattern$"다음 오류가 발생합니다.Illegal variable name.

모든 작은 따옴표를 사용하면 작동하지만 변수 대체를 원하면 모든 작은 따옴표가 작동 하지 않습니다 . 예를 들면 다음과 같습니다.

나는 문자열이 있으면 A_BOOK파일 파일에 다른 문자열을 포함하여.

$ cat FILE
A_BOOK
B_BOOK_NOT_LAST
C_BOOK

BOOK을 변수 BK로 설정하면

set BK = BOOK

나는 모든 따옴표와 grep을 경우에, 나는 다음과 같은 오류가 발생합니다 : grep "${BK}$" FILE*: 변수 치환, 패턴의 끝을위한 2 차 (에 대한 1 차 $ 불법 변수 이름 ).

모든 작은 따옴표로 grep하면 변수 대체가 발생하지 않습니다. grep '${BK}$' FILE아무것도 반환하지 않습니다

큰 따옴표와 작은 따옴표의 조합을 사용하면 기대하는 것을 얻습니다. 변수 대체를위한 큰 따옴표 및 패턴 끝을위한 작은 따옴표.

$ grep "${BK}"'$'  # << gives expected output
A_BOOK
C_BOOK

csh를 사용하고있는 것 같습니다. "foo$"구문은 쉬와 가족에 잘 작동합니다.
Olorin

네 올 로린 tcsh를 사용하고 있습니다. 지적 해 주셔서 감사합니다.
user274900

0

위의 사항을 따른 후에도 아무런 효과가 없으면 줄 끝으로 인한 것일 수 있습니다. 수정하려면 다음 dos2unix pr0n.txt을 수행 grep하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.