"grep -v "^.$""는 무엇을 합니까?

"grep -v "^.$""는 무엇을 합니까?

데이터 파일을 정리하는 스크립트가 있습니다.

명령:

for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`

함수 없이 명령을 실행해 보았지만 grep -v아무런 차이가 없습니다.

나는 그 일이 무엇인지 알고 싶습니다 grep -v "^.$". 나는 이 스크립트를 만들지 않았으며 온라인에서 아무것도 찾을 수 없습니다.

답변1

grep -v "^.$"문자가 하나만 있는 줄을 제외하고 입력의 모든 줄을 인쇄합니다.

다음과 같은 용도로 사용됩니다.

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

의 출력(상대 경로가 사용될 때 표시됨) .에서 현재 작업 디렉터리( )를 삭제하는 것이라고 가정할 수 있습니다. 이는 옵션으로 쉽게 달성할 수 있지만 여기서는 에서 절대 경로를 사용하므로 중복됩니다 .find.-mindepth 1find

data-나중에는 이름에 가 포함된 파일만 검색하므로 grep data-이것도 중복됩니다. 단일 find호출에 모든 논리를 넣을 수 있습니다.

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

Drop -print도 기본 동작입니다.

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

참고로 파일만 찾고 있다면 -type f다음도 추가하세요.

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15

답변2

다른 사람들이 이미 말했듯이, grep -v '^.$'정확히 한 문자(줄의 시작 부분( ^), 한 문자( .), 줄 끝( $)으로 구성된 줄)으로 구성된 줄을 필터링합니다. 이를 작성하는 또 다른 방법은 다음과 같습니다. grep -vx .여기서 the는 and를 암시적으로 -x만듭니다 ( 전체 행에서 일치).^$.

출력에서 :

find /ddomain/data/shop12/ -mtime +15 -print

해당 명령의 출력은 find일반적으로 다음과 같은 줄로 구성되므로 이는 거의 의미가 없습니다.

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

해당 출력에 단일 문자가 있는 줄을 포함하는 유일한 방법은 이름이 foo<newline>X<newline>. 그것은 완벽하게 가능하지만 그것이 그 명령의 의도였을 것 같지는 않습니다.

아마도 해당 명령은 다음에서 (잘못) 적용되었습니다.

find . -mtime +15 -print | grep -v '^.$' | grep data-

grep항목 을 필터링하기 위한 의도였습니다 ( .그때에도 grep -Fvx .더 적절했을 것입니다). 그러나 그렇다면 다음과 같이 작성하는 것이 더 합리적이었을 것입니다.

find . ! -name . -path '*data-*' -mtime +15

를 사용하여 최상위 디렉터리를 필터링하려면 find /ddomain/data/shop12/다음과 같이 하세요.

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

또는 find구현이 조건자를 지원 하는 경우 -mindepth:

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15

답변3

.결과 목록에서 디렉터리를 제거합니다 find. 예를 들어 설명하는 것이 더 쉽습니다.

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

보시다시피 첫 번째 코드 조각에서 결과를 찾습니다 .. 따라서 이를 주기가 수행하는 작업에 전달합니다 for. 두 번째 스니펫에서는 의 결과에서 디렉터리를
건너뛰기로 결정하여 해당 디렉터리를 주기로 보내지 않습니다 ..findfor

답변4

grep -v '^.$'문자가 하나만 있는 줄은 제외됩니다.

예:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

관련 정보