命令:grep '\.png' organized.txt \| awk '{print NF}' | sed 's/.*organized\///' > png_paths.txt
第一步:grep '\.png$' organized.txt (筛选过滤)
🔍 原理拆解:
grep是 Linux 下的文本搜索神器。'\.png$'是正则表达式 :\.:在正则里,.代表"任意字符",为了精准匹配真实的"点",必须用反斜杠\进行转义。png:字面匹配。$:这是行尾锚点 。它确保.png必须出现在这一行的最后。如果不加$,像abc.png.txt这样的行也会被误伤选中。
- 此时流水线上的数据:只剩下包含 PNG 图片信息的那些行(排除了文件夹和其他 txt 文件)。
第二步:| awk '{print $NF}' (按列提取)
🔍 原理拆解:
|是管道符,把 grep 的输出直接作为 awk 的输入。awk是一个极其强大的按列处理文本的工具。它默认把空格或 Tab 当作"分隔符",把一行文本切成很多个"字段(列)"。{print $NF}是核心:- 在 awk 中,
$1代表第1列,$2代表第2列。 NF是一个内置变量,全称是 Number of Fields(当前行的总列数)。- 所以
$NF就代表"最后一列"。
- 在 awk 中,
- 💡 巧妙之处 :你的原文件里,时间、大小、MD5码之间可能有多个空格,导致列数不固定。如果用
$7或$8可能会取错。但用$NF,不管前面有多少列,它永远只死死咬住最后一列(OSS路径),非常健壮。
第三步:| sed 's/.*organized\///' (正则裁剪)
🔍 原理拆解:
sed是流编辑器,擅长对文本进行替换、删除。s/旧内容/新内容/是 sed 的替换语法(Substitute)。- 旧内容
.*organized\/也是正则表达式:.*:匹配任意数量的任意字符(贪婪匹配,一路匹配到organized前面)。organized:字面匹配。\/:因为 sed 的替换语法是用斜杠/做分隔符的(s/A/B/),如果匹配内容本身包含斜杠,就必须加\转义。
- 新内容
//:斜杠中间是空的,意思就是把匹配到的那一长串前缀直接替换为空(也就是删除)。
第四步:> png_paths.txt (重定向输出)
🔍 原理拆解:
>是标准输出重定向符。- 它会把前面所有命令的最终结果写入
png_paths.txt。如果文件存在,它会先清空原文件再写入 (保证每次运行都是干净的新结果)。如果是>>则是追加到末尾。
🌟 架构师视角的延伸思考(结合你的软考备考)
- 流式处理(Stream Processing) : 这三个工具(grep, awk, sed)都不会把几个 GB 的 txt 文件一次性读进内存(这会导致内存溢出)。它们是读一行、处理一行、传给下一行 。用空间换时间,或者用流式处理避免内存峰值。
- 模块化与高内聚低耦合(管道哲学) :
grep只负责"找"(过滤)。awk只负责"切"(提取)。sed只负责"改"(替换)。 每个工具只做一件事,并做到极致,然后通过管道|组合起来解决复杂问题。这其实就是软件架构中微服务/模块化设计的鼻祖思想。