gpt4 book ai didi

linux - 使用 grep 搜索文件并仅输出部分行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:48 26 4
gpt4 key购买 nike

我正在查看日志文件并试图在我的最终文件中获得更简洁的输出。如果我 grep 一个值,我想格式化输出以删除除日期和 url 之外的任何内容。

例如这里是文件的一行。

Sep 25 08:07:51 10.20.30.40 FF_STUFF[]: 1545324890 1 55.44.33.22 10.9.8.7 - 10.60.154.41 http://website.com 0 BYF ALLOWED CLEAN 2 1 0 0 0 (-) 0 - 0 - 0 sqm.microsoft.com - [-] sqm.microsoft.com - - 0

我想执行一个 grep 或一个更好的命令(如有必要),以输出到仅列出粗体条目的 .txt 文件。基本上列出日期和 URL。那么我如何告诉它列出前 15 个字符(包括空格),然后找到第一个 http/https 并列出所有内容直到第一个空格?每行的长度或任何类似性质的内容都不相同,所以我不能只按字符位置。

所以我的输出是

Sep 25 08:07:51 http://website.com

谢谢。

最佳答案

你不能轻易地在 grep 中使用 -o 选项,因为你有两个模式,由可变数量的字符分隔(和 -o 将打印完整的匹配部分)。

如果您只想提取 URL,这就足够了:

$ grep -oE 'https?:[^ ]+' file
http://website.com

但是要同时提取日期和 URL,最简单的解决方案可能是使用 GNU awk:

$ awk '{ match($0, /https?:[^ ]+/, url); print $1, $2, $3, url[0]; }' file
Sep 25 08:07:51 http://website.com

打印前三个字段($1$3,以空格分隔),然后搜索带有 match() 的 URL (假设它不包含空格,即空格字符总是被正确转义;作为 +%20),然后打印找到的第一个 URL(在日期之后).

如果您有 POSIX awk(或使用 --posix 标志调用 gawk),解决方案有点冗长,因为 POSIX match() 不支持将匹配的部分保存到数组中(第三个参数,url),你必须使用 substr() 显式提取 URL找到匹配项时:

$ awk '{ match($0, /https?:[^ ]+/); print $1, $2, $3, substr($0, RSTART, RLENGTH); }' file
Sep 25 08:07:51 http://website.com

关于linux - 使用 grep 搜索文件并仅输出部分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46533931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com