오늘의 내용을 얻으려고합니다 "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 1
xargs
기본 이름으로 하나의 인수만 사용하도록 지시합니다 . 따라서 더 많은 것을 수신하면 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