【问题标题】:get file names, time stamps and MD5 checksums from a log file从日志文件中获取文件名、时间戳和 MD5 校验和
【发布时间】:2013-06-18 20:09:24
【问题描述】:

我想写一个 bash 脚本,它将获取一个日志文件的输出并将相关内容提取到另一个日志文件中,我将使用该脚本对发送文件所需的时间进行统计分析作为示例:

内容如下:

FileSize  TimeStamp         MD5          Full Path to File
4824597   2013-06-21 11:26  5a264...c11  ...45/.../.../ITAM.xml 
4824597   2013-06-20 23:18  5a264...c11  ...48/.../.../1447_rO8iKD.TMP.ITAM.xml

我正在尝试提取文件的 TimeStamp完整路径

我是脚本的初学者,但到目前为止我已经尝试过:

    cat "/var/log/Customer.log" | grep '2013* *11' >> test.txt 

我还缺少其他方法吗?非常感谢。

【问题讨论】:

  • cat "/var/log/Customer.log" | grep '2013* *11' >> test.txt
  • True @lhf, grep expr /var/log/Customer.log >> test.txt 会做的。但请保持友善:P
  • 最明显的问题是你没有关闭你的报价,这只是问题中的一个错字吗?您要匹配的具体是什么,从您的错误尝试中很难判断。
  • @Barmar 是的,这只是一个错字。我更新了这个问题,因为我问错了,请帮助我更新。
  • 我已经修正了错字,但你还没有澄清。 grep 用于选择行,您要匹配哪些行? 2013 看起来像年份,但 11 是什么——小时、日期或其他什么?

标签: regex perl sed awk pattern-matching


【解决方案1】:

看起来这就是你想要的:

awk '$2 ~ /^2013/ && $4 ~ /11$/ { print $2, $3, $NF; }' /var/log/Customer.log > test.txt
  • $2 ~ /^2013/ 匹配从 2013 年开始的日期
  • $4 ~ /11$/ 匹配以 11 结尾的 MD5
  • print $2, $3, $NF 打印字段 2(日期)、3(时间)和最后一个字段(路径名)

如果您对这些正则表达式感到困惑,请转到 Regular-Expressions.info 并阅读教程。

【讨论】:

  • 当时间保存到 test.txt 中时,有没有办法将时间戳保存在一个数组中,例如,然后运行一个循环从另一个数组时间戳中减去时间戳?跨度>
  • 可以,可以添加到数组中,最后使用awk中的END块处理数组。但这不就是统计分析脚本的作用吗?
  • 这就是我想让它理想地做的事情,哈哈。我正在写它。
  • 到目前为止,这是我从另一个用户那里得到的关于堆栈溢出的帮助:Code awk '{ sub(/:/," ",$2); t1=mktime(strftime("%Y %m %d")" "$2" 00"); getline
  • 在 cmets 中阅读代码真的很难。如果您遇到新问题,请提出新问题。
【解决方案2】:

假设列是制表符分隔的,您可以使用cut

cut -f2,4 /var/log/Customer.log | grep -v MD5 >> test.txt

会将第 2 列和第 4 列(从 1 开始计数)附加到 test.txt。包含MD5 的行将被grep 调用删除。

【讨论】:

  • 你需要过滤掉标题行。
  • 没错,这可能只是稍后的一步。就像我后来添加的grep 一样。感觉比你的awk 调用更简单,虽然我真的应该了解更多awk
【解决方案3】:

你可以这样做:

awk 'NR!=1 {print $2 " " $3 "\t" $5}' Customer.log > stat.txt

【讨论】:

  • 当时间保存到 test.txt 中时,有没有办法将时间戳保存在一个数组中,例如,然后运行一个循环从另一个数组时间戳中减去时间戳?跨度>
【解决方案4】:

如果您想提取所有条目的时间戳和完整路径,那么这应该可以:

awk 'NR>1{print $2,$3,$NF}' inputFile > outputFile

【讨论】:

  • 当时间保存到 test.txt 中时,有没有办法将时间戳保存在一个数组中,例如,然后运行一个循环从另一个数组时间戳中减去时间戳?跨度>
  • @user2019182 是的,您必须使用mktime() 函数。按原样删除时间戳会很痛苦。
  • 我在这里提出了一个新问题stackoverflow.com/questions/17245135/…
【解决方案5】:

GNU 代码

sed -nr '2,$ {s/\S+\s+(\S+)\s+(\S+)\s+\S+\s+(.*)/\1 \2\t\3/;p}' file

$猫文件 FileSize TimeStamp MD5 文件的完整路径 4824597 2013-06-21 11:26 5a264...c11 ...45/.../.../ITAM.xml 4824597 2013-06-20 23:18 5a264...c11 ...48/.../.../1447_rO8iKD.TMP.ITAM.xml $sed -nr '2,$ {s/\S+\s+(\S+)\s+(\S+)\s+\S+\s+(.*)/\1 \2\t\3/;p}' 文件 2013-06-21 11:26 ...45/.../.../ITAM.xml 2013-06-20 23:18 ...48/.../.../1447_rO8iKD.TMP.ITAM.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多