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

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

오늘부터 "ERROR".

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

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

현재 출력(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 1xargsbasename에 대해 정확히 하나의 인수를 사용하도록 지시합니다 . 따라서 더 많이 수신하면 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

관련 정보