在第一次出现分隔符时分割字符串

在第一次出现分隔符时分割字符串

我在 shell (bash) 中执行 grep 来搜索许多日志文件中的一些 id:

grep "100200300" my.log*

结果是这样的:

my.log:Jan 17 15:04:52 100200300 ok
my.log.1:Jan 17 14:35:17 100200300 failed

现在我想从输出中删除文件名。那么如何在第一次出现“:”时分割此文本并输出第二部分。

答案1

正如 Steeldriver 所评论的,首选方法是使用-h( --no-filename) 选项。如果您的实现grep不包含此选项,您可以使用sedcut来更改输出:

grep [OPTIONS] PATTERN [FILE...] | sed 's/[^:]*://'
grep [OPTIONS] PATTERN [FILE...] | cut -d : -f 2-

但请注意,此解决方案并不通用,因为它会破坏包含冒号 ( :) 的文件名。

答案2

这将执行此问题的标题所要求的操作:“在第一次出现分隔符时分割字符串”

#!/bin/bash
while read -r line; do
    [[ $line =~ :(.*) ]] && echo "${BASH_REMATCH[1]}"
done <<<"$(grep "100200300" my.log*)"

但是,我相信您需要的是:

grep -h "100200300" my.log*

-h选项将导致文件内容没有文件名:

Jan 17 15:04:52 100200300 ok
Jan 17 14:35:17 100200300 failed

答案3

您还可以执行以下操作来删除文件名:

cat my.log* | grep "100200300"

相关内容