如何从download.log提取所有zip文件名及大小并保存到新文件?
首先,你当前使用的grep命令之所以返回整个文件,是因为你的正则表达式写得有问题:......*|.zip 这个表达式里,......* 其实等价于匹配任意长度≥6的字符串(6个.匹配任意6个字符,*让前面的.重复任意次数),再加上|.zip(匹配任意单个字符+zip),几乎所有行都会被匹配到,自然就返回了整个日志文件。
下面给你几个实用的解决思路,你可以根据download.log的实际格式调整:
方法1:先过滤含.zip的行,再用awk提取关键内容
grep的核心是过滤行,而awk擅长提取行内的字段。假设你的日志行格式类似这样:
2024-05-20 10:05:00 /home/user/downloads/report.zip 789KB
2024-05-20 10:10:00 /tmp/backup_2024.zip 1.2MB
你可以先过滤出包含.zip的行,再用awk提取文件名和大小字段:
grep '\.zip' download.log | awk '{print $4, $5}' > zip_sizes.txt
这里的$4和$5是字段位置,你需要根据自己日志里的字段顺序调整——比如如果文件名是第3个字段,大小是第6个,就改成print $3, $6。
方法2:用grep的-o选项+精确正则直接提取目标内容
如果你的日志里,zip文件名和大小是成对出现的(比如文件名后面跟着括号括起来的大小),可以用grep -o只输出匹配的部分,结合分组正则来精准提取:
假设日志行是:
Download completed: data_archive.zip (456KB)
Saved file: docs_backup.zip (2.1MB)
可以用这个命令:
grep -E -o '([a-zA-Z0-9_\/-]+\.zip).*\(([0-9.]+\w+)\)' download.log | sed 's/\(.*\.zip\) (\(.*\))/\1 \2/' > zip_sizes.txt
[a-zA-Z0-9_\/-]+\.zip匹配包含路径、下划线、连字符的zip文件名(你可以根据实际文件名规则调整字符范围)\(([0-9.]+\w+)\)匹配括号里的大小内容- 最后用
sed把匹配结果整理成文件名 大小的格式
关键提示
如果上面的命令不适用,你可以先运行head download.log查看几行日志的具体格式,然后针对性调整正则或字段位置——核心是先明确:
- zip文件名在日志行里的特征(比如以
.zip结尾,前面是路径或纯文件名) - 大小信息的特征(比如数字+KB/MB,或者括号包裹,或者带有
size:前缀)
内容的提问来源于stack exchange,提问作者Valen Tin

