【问题标题】:Using sed to extract text from a log file使用 sed 从日志文件中提取文本
【发布时间】:2013-08-21 12:36:24
【问题描述】:

我正在编写一个脚本,该脚本从 .log 文件中提取备份的数据量并将其通过电子邮件发送给我。我相信“sed”功能可以做到这一点。以下命令显示了我想看到的内容。特别是,如何提取文本“Backed-up 6.776 GB”?如果数字改变并变成 TB,“sed”应该仍然可以工作。 “sed”可以这样做吗?

命令:

grep "Backed-up" Daily_Backups-Exchange-1376798400228#0-3018-Exchange_VSS_Writer_2007.log

输出:

2013-08-18 00:12:44 avtar Info <6083>: Backed-up 6.776 GB in 0.03 minutes: 12,301 GB/hour (0 files/hour)

【问题讨论】:

    标签: unix sed grep


    【解决方案1】:

    这条sed 行应该可以工作:

    grep "Backed-up" filename.log |sed -e 's/^.* \(Backed-up [0-9\.]* [MGT]B\) in .*$/\1/'
    

    它匹配 MB、GB 和 TB。

    【讨论】:

    • 这是伟大的奥拉维尔!谢谢你。我还发现,在 Bash 中使用 printf 可以消除换行符 \n 无法被识别为 echo 的问题。
    • 无需通过管道将 grep 传递给 sed。 grep foo | sed 's/pat/repl/' 最好写成sed -n '/foo/s/pat/repl/p'
    【解决方案2】:

    如果您的输入格式在列数方面是稳健的:

    awk '$6 == "Backed-up" { print $6, $7, $8 }' input-file
    

    应该可以正常工作。

    【讨论】:

    • William,您的 awk 示例确实使代码更具可读性。如果“Backed-up”一词用空格分隔,如“Backed up”,这将如何工作?我们可以将“Backed up”定义为一个字段,即使它有一个空格?
    • 您可以尝试将RS 定义为“已备份”,但在这种情况下,$6=="Backed" &amp;&amp; $7 == "up" { print $6, $7, $8, $9 } 可能会更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2012-08-05
    • 1970-01-01
    • 2021-12-13
    • 2021-01-21
    • 2021-11-09
    相关资源
    最近更新 更多