오늘부터 "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 1
xargs
basename에 대해 정확히 하나의 인수를 사용하도록 지시합니다 . 따라서 더 많이 수신하면 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