如何剪切所有内容直到特定单词/在脚本中查找之后

如何剪切所有内容直到特定单词/在脚本中查找之后

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

相关内容