我正在尝试获取今天包含"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