특정 단어까지/스크립트에서 찾은 후까지 모든 것을 잘라내는 방법

특정 단어까지/스크립트에서 찾은 후까지 모든 것을 잘라내는 방법

오늘의 내용을 얻으려고합니다 "ERROR".

나는 이것을 사용하여 원하는 파일을 찾습니다.

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
   -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +

현재 출력(오류가 발견된 경우):

/home/user/logfilesError/gandalf_123.log

하지만 내가 원하는 출력은 로그 파일 이름일 뿐입니다.

gandalf_123.log

메시지: 경로가 자주 바뀌기 때문에 이전 글자를 그냥 잘라낼 수는 없습니다.

당신의 도움을 주셔서 감사합니다!

답변1

basename도구는 파일 이름 앞의 경로를 제거할 수 있습니다.

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 basename

원하는 출력을 제공합니다.

-n 1xargs기본 이름으로 하나의 인수만 사용하도록 지시합니다 . 따라서 더 많은 것을 수신하면 basename각 매개변수에 대한 프로세스가 생성됩니다. basename인수로 파일 이름만 필요하므로 이는 필수입니다 .

파일 이름에 공백이 포함되어 있으면 이 명령이 작동하지 않습니다. 이 경우 @HaukeLaging에서 제안한 대로 다음을 사용하세요.

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 -d \\n basename

그러나 파일 이름에 개행 문자가 포함되어 있으면 작동하지 않습니다.

답변2

그것이 당신에게 효과가 있다면 ./gandalf_123.log사용할 수 있습니다

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
  -daystart -mtime -1 -execdir grep -rl "ERROR" "{}" +

그렇지 않으면 원하지 않는 부분을 제거하기 위해 grep출력을 파이프합니다 .sed

> echo /home/user/logfilesError/gandalf_123.log |
  sed 's+.*/++'
gandalf_123.log

답변3

당신은 그것을 사용할 수 있습니다 sed:

... | sed -e 's=.*/=='

이는 a 이전의 모든 항목을 아무것도 아닌 항목으로 바꾸도록 지시합니다 /.

를 사용할 수도 있지만 cut오른쪽부터 계산되지 않으므로 다음과 결합해야 합니다 rev.

... | rev | cut -d/ -f1 | rev

답변4

이 작업은 다음을 통해 수행할 수 있습니다.

 echo ${str##*/}

마지막 "/"까지 문자열을 왼쪽에서 오른쪽으로 자릅니다.

> str=/home/user/logfilesError/gandalf_123.log
> echo ${str##*/}
gandalf_123.log

관련 정보