发布时间:2026/7/23 21:47:35
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软件安装的完整指南

相关新闻

2026/7/23 21:47:35

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

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

2026/7/23 21:47:35

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

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

2026/7/23 23:03:05

数据结构(串)

串的定义 串,即字符串(String)是由零个或多个字符组成的有限序列。一般记为S′a1a2⋯⋯an′(n≥0)S a_1a_2\cdots\cdots a_n \quad (n \ge 0)S′a1​a2​⋯⋯an′​(n≥0)其中,SSS是串名,单引号括起来的字符序列是串的…

2026/7/23 23:03:05

3D地图展示vue+three.js

公司项目中刚好使用了3d地图用以大屏的展示,用AI写了一个小demo随手记录一下。 git地址:gitee 主要三方库使用如下: threejs3D 前端框架three.interactive点击事件库gsap动画库d3-geoD3 的扩展库,提供了多种地理投影和路径生成器…

2026/7/23 23:03:05

多元线性回归

文章目录前言1. 多元线性回归算法1.1 定义和特征向量化1.2 多元线性回归的梯度下降1.3 梯度下降的替代方案:正规方程法2. 学习曲线3. 特征缩放4. 特征工程前言 本章主要围绕多元线性回归,介绍了向量化,学习率、特征缩放、特征工程等基础知识…

2026/7/23 23:03:05

DAMA DMBOK2修订版 重点章节分析(二):数据治理

目录 1.本章重点 2.什么是数据治理 3.数据治理的业务驱动因素 4.数据治理组织 5.数据治理运营模型 6.数据治理活动 7.数据治理活动的度量指标 8.本章讨论 9.其他 1.本章重点 本章CDGP考试的重点内容涵盖以下五个方面:数据治理到底有哪些内容、数据治理包括…

2026/7/23 22:58:05

从 Kimi K3 看 AI 创业终局:四层护城河与中小团队生存路径

Kimi K3重磅炸场!无数AI创业者无路可走?【摘要】通用大模型参数规模与综合能力高速迭代,垂直 AI 工具正面临同质化降维冲击。通过拆解工具、效率、业务、生态四层商业护城河框架,结合技术落地实践与产业案例,为 AI 创业…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/23 0:01:10

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/22 21:00:12

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…