我在 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
不包含此选项,您可以使用sed
或cut
来更改输出:
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"