Regex 从日志文件中获取文件名、时间戳和MD5校验和

Regex 从日志文件中获取文件名、时间戳和MD5校验和,regex,perl,sed,awk,pattern-matching,Regex,Perl,Sed,Awk,Pattern Matching,我想编写一个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 ...4

我想编写一个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
我正在尝试提取文件的时间戳和完整路径

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

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

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

看起来这正是您想要的:

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

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

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

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

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

您可以这样做:

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

如果要提取所有条目的时间戳和完整路径,则此操作应有效:

awk 'NR>1{print $2,$3,$NF}' inputFile > outputFile
GNU代码:


$cat文件 文件大小时间戳MD5文件的完整路径 48245972013-06-2111: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
cat“/var/log/Customer.log”|grep'2013**11'>>test.txtruel@lhf,
grep expr/var/log/Customer.log>>test.txt
。但是请友好一点:p最明显的问题是你没有关闭你的报价,这只是问题中的一个输入错误吗?你到底想匹配什么,很难从你的错误尝试中分辨出来。@Barmar是的,这只是一个打字错误。我更新了问题,因为我问错了。请帮助我更新。我已经纠正了错误,但你仍然没有澄清
grep
用于选择行,您要匹配哪些行<代码>2013看起来像是一年,但什么是
11
——小时、天或其他?你需要过滤掉标题行。没错,这可能只是以后的另一步。就像我迟来添加的
grep
一样。它感觉比您的
awk
调用更简单,不过我确实应该了解更多
awk
。当时间保存到test.txt中时,是否有方法将时间戳保存在数组中,例如,然后运行循环从另一组数组时间戳中减去时间戳?当时间保存到test.txt中时,是否有一种方法可以将时间戳保存在一个数组中,例如,然后运行一个循环,从另一组数组的时间戳中减去时间戳?@user2019182是的,您必须使用
mktime()
函数。按原样删除时间戳会很痛苦。当时间保存到test.txt中时,我在这里提出了一个新问题,是否有方法将时间戳保存在数组中,例如,然后运行循环从另一组数组时间戳中减去时间戳?是的,您可以添加到数组,然后使用
awk
中的
END
块处理末尾的数组。但这不是统计分析脚本所做的吗?这就是我想让它理想地完成的lol。我正在编写它。到目前为止,这是我从另一个用户那里得到的关于堆栈溢出的帮助:代码awk'{sub(/:/,“”,$2);t1=mktime(strftime(“%Y%m%d”)“$2”00”);getlinesed -nr '2,$ {s/\S+\s+(\S+)\s+(\S+)\s+\S+\s+(.*)/\1 \2\t\3/;p}' file $cat file 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 $sed -nr '2,$ {s/\S+\s+(\S+)\s+(\S+)\s+\S+\s+(.*)/\1 \2\t\3/;p}' file 2013-06-21 11:26 ...45/.../.../ITAM.xml 2013-06-20 23:18 ...48/.../.../1447_rO8iKD.TMP.ITAM.xml