Shell脚本进阶——管道、正则和批量数据处理
面试翻车现场上篇讲了Shell脚本基础有读者说我会写if和for了但看别人的脚本里一堆|、grep、awk、sed完全看不懂。这就是管道和文本处理工具。它们是Shell脚本的灵魂。面试中也常考。我一般会问给你一个日志文件怎么找出所有ERROR行并统计数量如果你只会用vim打开然后数那就尴尬了。管道命令的串联管道的思想很简单把一个命令的输出传给下一个命令作为输入。符号是|。ps aux | grep robot # 列出进程过滤出robot相关的 cat log.txt | grep ERROR # 读日志过滤出ERROR行 ls -l | wc -l # 列出文件统计行数即文件数量管道可以串联多个命令cat robot.log | grep ERROR | grep lidar | wc -l这条命令做了四件事读日志→找ERROR→再找包含lidar的→统计行数。最终结果是激光雷达相关的错误数量。重定向echo hello file.txt # 写入文件覆盖 echo world file.txt # 追加到文件 cat log.txt 21 # 把标准错误重定向到标准输出 command /dev/null 21 # 丢弃所有输出21这个写法很常见但新手容易搞混。文件描述符1是标准输出2是标准错误。21意思是把标准错误也送到标准输出去。配合就能把所有输出都重定向到文件或者丢弃。grep文本搜索利器grep是最常用的文本搜索工具。grep ERROR robot.log # 搜索包含ERROR的行 grep -i error robot.log # 忽略大小写 grep -r TODO src/ # 递归搜索目录下所有文件 grep -n ERROR robot.log # 显示行号 grep -c ERROR robot.log # 只输出匹配行数 grep -v DEBUG robot.log # 反向匹配排除DEBUG grep -E ERROR|WARN robot.log # 扩展正则匹配ERROR或WARN组合使用# 找出最近1小时内修改过的文件 find ~/robot_ws -name *.cpp -mmin -60 # 找出所有包含TODO的C文件 grep -rn TODO src/ --include*.cpp # 统计每个文件的ERROR数量 grep -c ERROR *.log | sort -t: -k2 -nrsed流编辑器sed可以在不打开文件的情况下修改文本。sed s/old/new/g file.txt # 替换只输出不改文件 sed -i s/old/new/g file.txt # 直接修改文件 sed -i s/DEBUG/INFO/g *.log # 批量修改多个文件 sed -n 10,20p file.txt # 只输出第10到20行 sed /ERROR/d file.txt # 删除包含ERROR的行实际应用场景# 批量修改配置文件中的IP地址 sed -i s/192.168.1.100/192.168.1.200/g config.yaml # 给所有C文件添加头文件保护 sed -i 1i #pragma once *.h # 删除日志中的时间戳假设格式是[2024-01-01 12:00:00] sed s/\[[0-9-]* [0-9:]*\]//g robot.logawk文本处理利器awk是按列处理文本的工具。默认以空格或Tab分隔。# 输出每行的第1列和第3列 awk {print $1, $3} data.txt # 输出进程列表中CPU占用超过10%的进程 ps aux | awk $3 10 {print $2, $3, $11} # 计算日志中ERROR出现的次数 grep ERROR robot.log | awk END {print NR} # 按分隔符处理 echo a:b:c | awk -F: {print $2} # 输出bawk还能做数学运算# 计算一列数字的平均值 cat scores.txt | awk {sum $1} END {print sum/NR} # 统计日志中每种错误类型的数量 grep ERROR robot.log | awk {print $5} | sort | uniq -c | sort -rn正则表达式正则表达式是文本匹配的通用语法grep、sed、awk都支持。常用模式. 匹配任意单个字符 * 匹配前一个字符0次或多次 [abc] 匹配a、b或c [a-z] 匹配a到z之间的任意字符 ^ 行首 $ 行尾 \d 数字需要-E或-P \w 字母数字下划线 匹配前一个字符1次或多次 ? 匹配前一个字符0次或1次 () 分组 | 或实际例子# 匹配IP地址 grep -E [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} log.txt # 匹配邮箱 grep -E [a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,} contacts.txt # 匹配ROS2的topic名称以/开头 grep -E ^/[a-z_/] topics.txt批量数据处理实战场景1分析机器人日志#!/bin/bash # 分析日志中的错误分布 LOG_DIR~/robot_logs echo 日志错误分析 for log in $LOG_DIR/*.log; do errors$(grep -c ERROR $log 2/dev/null || echo 0) warns$(grep -c WARN $log 2/dev/null || echo 0) echo $(basename $log): ERROR$errors, WARN$warns done echo echo 最常见的ERROR类型 grep ERROR $LOG_DIR/*.log | awk -FERROR {print $2} | sort | uniq -c | sort -rn | head -10场景2批量重命名文件#!/bin/bash # 把所有.jpg改成.png假设内容已经是PNG格式 for file in *.jpg; do mv $file ${file%.jpg}.png done echo 重命名完成场景3提取ROS2 bag中的信息#!/bin/bash # 列出所有rosbag中的topic和消息数量 for bag in ~/bags/*.db3; do echo $(basename $bag) ros2 bag info $bag | grep -E Topic|Count echo done面试常见考点管道和重定向的区别——管道把一个命令的输出传给另一个命令重定向把命令的输出送到文件或从文件读取输入。grep、sed、awk分别适合什么场景——grep擅长搜索过滤sed擅长替换修改awk擅长按列处理和统计。怎么统计一个文件中某个单词出现的次数——grep -o word file | wc -l。-o让grep每个匹配输出单独一行然后wc -l统计行数。xargs是什么——把标准输入转换成命令的参数。比如find . -name *.log | xargs rm先找到所有.log文件然后传给rm删除。Shell脚本的工程实践在实际项目中Shell脚本经常用于系统初始化和部署流程。一个好的习惯是在脚本开头加上set -euo pipefail这样遇到未定义变量、命令失败或管道错误时都会立即退出。另外用trap捕获退出信号可以做清理工作比如删除临时文件。面试时被问到Shell编程能力举一个实际的自动化部署案例会比泛泛而谈好得多。给你的建议管道和文本处理工具需要多练。光看教程没用得在实际场景中用几次才能记住。给你几个练习题找出当前目录下最大的10个文件统计你的代码仓库里有多少行C代码从日志中提取所有IP地址并去重。做机器人开发你每天都会和数据打交道——日志、配置文件、传感器输出。掌握这些工具你就能快速从海量数据中提取有用信息。这比写Python脚本快得多特别是在SSH到机器人上的时候。上一篇第89篇 Shell脚本入门——自动化测试和环境配置的起点下一篇预告第91篇 apt与源码编译——Linux软件安装的完整指南

相关新闻

别怕心脏“乱了节奏”——三种方法帮你找回平稳心跳

别怕心脏“乱了节奏”——三种方法帮你找回平稳心跳

持续性房颤,就是心脏的“电路系统”彻底乱了,心房像一锅沸腾的粥一样持续乱颤超过7天。好消息是,目前医学上有三把“钥匙”可以应对。下面逐一介绍。第一把钥匙:药物治疗——给心脏“降速防堵”药物是治疗的基础手段,主…

2026/7/23 21:47:35阅读更多 →
笑麻!OpenCut:我用了四年,反倒成抄袭的了?

笑麻!OpenCut:我用了四年,反倒成抄袭的了?

在开源圈混久了,见过代码搬运、见过功能照搬、见过套壳碰瓷,但只抄个名字,就能把原创正主污成山寨抄袭者的魔幻名场面,今天算是彻底开眼了。今天的冤种主角,是实打实的国产工具OpenCut。全程剧情简单概括:国…

2026/7/23 21:47:34阅读更多 →
AI写公众号为什么总被说“一眼AI“?两个Skill背后的方法论拆解

AI写公众号为什么总被说“一眼AI“?两个Skill背后的方法论拆解

"一眼AI"到底是什么意思公众号评论区有个高频词:"一眼AI"。读者用这个词的时候,并不是在说"你用了AI写东西",而是在说"你写的东西没有值得读的理由"。套话堆砌、没有观点、结构工整到不像人写的——…

2026/7/23 21:47:34阅读更多 →
价值验收怎么算才可信:BI项目上线后的3类基线口径与5个验收指标

价值验收怎么算才可信:BI项目上线后的3类基线口径与5个验收指标

导语 有一个反直觉的行业现状:超过60%的BI项目上线后无法顺利通过价值验收,核心卡点从来都不是功能开发不全、性能不达标,而是业务方、IT方、项目交付组三方对「什么叫项目成功」的判断标准不统一——IT认为把数据链路搭通、报表能出数就是完…

2026/7/24 1:34:25阅读更多 →
AI智能体约束工程:确保AI安全可控的关键技术

AI智能体约束工程:确保AI安全可控的关键技术

1. AI Agent Harness Engineering 是什么?AI Agent Harness Engineering(AI智能体约束工程)是近年来兴起的一个技术领域,它专注于设计、构建和管理AI智能体(Agent)的行为约束系统。简单来说,就是…

2026/7/24 1:34:25阅读更多 →
从驾驶舱到智能助手:CEO一天的决策场景正在被重写

从驾驶舱到智能助手:CEO一天的决策场景正在被重写

导语 一个反直觉的观察:越是成熟的 CEO,越少主动"打开"驾驶舱。 过去几年,我们服务了大量处在不同数字化阶段的企业,一个明显的变化是——CEO 每天花在"看数"上的时间正在被稀释,而"被数据找…

2026/7/24 1:34:25阅读更多 →
Qwen3.8-Max-Preview大模型前端开发能力深度评测与应用指南

Qwen3.8-Max-Preview大模型前端开发能力深度评测与应用指南

这次我们来看阿里云最新发布的 Qwen3.8-Max-Preview 大模型,重点不是介绍基础功能,而是它在前端开发能力上的显著提升。如果你正在寻找能够辅助前端编程、代码审查、组件生成和调试的 AI 工具,这个版本值得重点关注。Qwen3.8-Max-Preview 作为…

2026/7/24 1:34:25阅读更多 →
听到喜欢的歌怎么做成海报?用MusicCard一键生成音乐卡片

听到喜欢的歌怎么做成海报?用MusicCard一键生成音乐卡片

分享一首歌时,直接发送链接虽然方便,却很难表达当时的情绪。截取播放器页面又会带上大量按钮、水印和平台信息,真正想展示的封面、歌名与歌词反而不够突出。 如果经常发布朋友圈、社交平台或音乐推荐内容,可以把这些信息重新整理…

2026/7/24 1:34:25阅读更多 →
MSP430FE42x在单相电能计量中的超低功耗与高精度设计实践

MSP430FE42x在单相电能计量中的超低功耗与高精度设计实践

1. 项目概述:MSP430FE42x系列微控制器在单相电能计量中的应用在嵌入式系统设计领域,尤其是在需要长时间、不间断运行的电池供电设备中,功耗和精度是两个永恒的核心挑战。我接触过不少项目,从早期的分立式模拟前端加通用MCU的方案&…

2026/7/24 1:32:24阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →