![在第一次出现分隔符时分割字符串](https://linux22.com/image/81537/%E5%9C%A8%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%E5%88%86%E9%9A%94%E7%AC%A6%E6%97%B6%E5%88%86%E5%89%B2%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我在 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"