Linux 文本处理三剑客:awk、grep、sed 完全指南

Linux 文本处理三剑客:awk、grep、sed 完全指南

1. 概述

Linux 系统提供了三个强大的文本处理工具:awk、grep 和 sed,它们各有所长,结合使用可以高效地处理文本数据。

  • awk:擅长文本分析和格式化输出,是一门强大的脚本语言。
  • grep:擅长文本搜索和过滤。
  • sed:擅长文本编辑和转换。

这三个工具都支持正则表达式,可以处理标准输入和文件输入,是 Shell 脚本编程中不可或缺的工具。


2. awk 使用指南

2.1 基本介绍

awk 是一种编程语言,专门用于文本处理和数据提取,支持变量、条件判断、循环等编程特性。其名称来源于三位创始人的姓氏首字母。

2.2 基本语法

awk '模式 { 动作 }' [输入文件...]
命令 | awk '模式 { 动作 }'

2.3 工作原理

awk 按行处理文本,每行被分割成多个字段:

  • $0:整行内容
  • $1:第一个字段
  • $2:第二个字段

2.4 常用选项

选项说明示例
-F指定输入字段分隔符awk -F: '{print $1}' /etc/passwd
-v定义变量awk -v var=10 '{print $1 + var}' file
-f从脚本文件中读取 awk 命令awk -f script.awk data.txt

2.5 内置变量

变量说明示例
FS输入字段分隔符(默认空格)awk 'BEGIN{FS=":"}{print $1}' file
OFS输出字段分隔符(默认空格)awk 'BEGIN{OFS="-"}{print $1,$2}' file
RS输入记录分隔符(默认换行符)awk 'BEGIN{RS=";"}{print}' file
ORS输出记录分隔符(默认换行符)awk 'BEGIN{ORS="\n\n"}{print}' file
NF当前行的字段数量awk '{if(NF>5) print $0}' file
NR当前处理的总行号awk '{print NR, $0}' file
FNR当前文件中的行号awk '{print FNR, $0}' file1 file2
FILENAME当前文件名awk '{print FILENAME, $0}' file

2.6 示例

# 打印指定列(源文档示例)
awk '{print $1, $3}' file.txt# 指定分隔符(源文档示例)
awk -F: '{print $1, $6}' /etc/passwd# 使用条件过滤(源文档示例)
awk '$3 > 1000 {print $1}' /etc/passwd# 计算数值总和(源文档示例)
awk '{sum += $1} END {print sum}' file.txt# 使用BEGIN和END块(源文档示例)
awk 'BEGIN {print "开始处理"} {print $0} END {print "处理完成"}' file.txt# 使用内置变量(源文档示例)
awk '{print "行号:", NR, "字段数:", NF, "内容:", $0}' file.txt# 打印雇员信息(源文档示例)
awk '{ print }' employee.txt# 输出特定行(源文档示例)
awk '/张三/ { print }' employee.txt# 统计满足特定条件的记录数(源文档示例)
awk '/术/ { count=count+1 } END { print "Count="count }' employee.txt# 格式化输出表格(源文档综合示例)
awk 'BEGIN { printf "序号\t名字\t部门\t年龄\n-------------------\n" } { print } END {printf "-------------------\n"}' employee.txt

2.7 高级用法

# 使用数组统计词频(源文档示例)
awk '{for(i=1;i<=NF;i++) count[$i]++} END {for(word in count) print word, count[word]}' file.txt | sort -k2 -nr# 条件判断(源文档示例)
awk '{if($3 > 1000) print "用户:", $1, "UID:", $3; else print "系统用户:", $1}' /etc/passwd# 循环处理(源文档示例)
awk '{for(i=NF;i>=1;i--) printf "%s ", $i; printf "\n"}' file.txt# 9x9乘法表(源文档示例)
awk 'BEGIN {for(i=1;i<=9;i++){for(j=1;j<=i;j++) printf "%d*%d=%-2d ",j,i,j*i; print}}'

3. grep 使用指南

3.1 基本介绍

grep (Global Regular Expression Print) 用于在文本中搜索匹配指定模式的行。

3.2 基本语法

grep [选项] 模式 [文件...]
命令 | grep [选项] 模式

3.3 常用选项

选项说明示例
-i忽略大小写grep -i 'hello' file.txt
-v反向匹配,显示不匹配的行grep -v '^#' config.conf
-n显示行号grep -n 'error' logfile.txt
-c只显示匹配的行数grep -c 'pattern' data.txt
-r递归搜索目录grep -r 'function' /path/to/code/
-l只显示包含匹配的文件名grep -l 'TODO' *.py
-E使用扩展正则表达式`grep -E '(error
-A n显示匹配行及其后n行grep -A 3 'Exception' traceback.log
-B n显示匹配行及其前n行grep -B 2 'segmentation fault' system.log
-C n显示匹配行及其前后各n行grep -C 2 'keyword' file.txt

3.4 示例

# 搜索包含"error"的行(源文档示例)
grep 'error' logfile.txt# 忽略大小写搜索(源文档示例)
grep -i 'error' logfile.txt# 显示行号(源文档示例)
grep -n 'error' logfile.txt# 搜索并显示后3行内容(源文档示例)
grep -A 3 'error' logfile.txt# 递归搜索目录(源文档示例)
grep -r 'function' /path/to/code/# 使用扩展正则表达式(源文档示例)
grep -E '(error|warning)' logfile.txt# 统计文件中包含特定模式的记录数(源文档awk示例的grep等效)
grep -c 'pattern' employee.txt# 输出总长度大于10的行(源文档awk示例的grep等效)
grep '.\{11,\}' employee.txt

4. sed 使用指南

4.1 基本介绍

sed (Stream EDitor) 是一个流编辑器,用于对文本进行非交互式的编辑。

4.2 基本语法

sed [选项] '命令' [输入文件...]
命令 | sed [选项] '命令'

4.3 常用选项

选项说明示例
-n抑制自动输出,只显示处理过的行sed -n '10p' file.txt
-e允许多个编辑命令sed -e 's/foo/bar/' -e '/baz/d' file
-i直接修改文件内容sed -i.bak 's/old/new/g' file.txt
-r使用扩展正则表达式`sed -r 's/(foobar)/YES/g’ file`

4.4 常用命令

命令说明示例
s/模式/替换/标志替换操作sed 's/old/new/g' file.txt
p打印sed -n '1,5p' file.txt
d删除sed '/pattern/d' file.txt
a\文本在行后追加文本sed '$a\追加到最后一行' file.txt
i\文本在行前插入文本sed '1i\插入到第一行' file.txt
c\文本替换整行sed '/pattern/c\新的整行内容' file.txt

4.5 示例

# 替换文本(源文档示例)
sed 's/old/new/g' file.txt# 删除空行(源文档示例)
sed '/^$/d' file.txt# 直接修改文件(源文档示例)
sed -i 's/old/new/g' file.txt# 打印特定行(源文档示例)
sed -n '10,20p' file.txt# 多重编辑(源文档示例)
sed -e 's/foo/bar/g' -e '/baz/d' file.txt# 在匹配行后追加内容(源文档示例)
sed '/pattern/a\追加的内容' file.txt# 模拟cat命令打印文件内容(源文档示例)
sed '' data.txt# 从标准输入中读取数据(源文档示例)
echo "hello world" | sed ''# 使用脚本文件(源文档示例)
echo -e "1d\n2d\n5d" > scripts
sed -f scripts data.txt

5. 综合应用示例

5.1 日志分析

# 分析日志中的错误,统计每种错误的数量(源文档grep示例扩展)
grep 'ERROR' application.log | awk '{print $5}' | sort | uniq -c | sort -nr# 提取最近一小时的日志并分析(源文档sed示例扩展)
sed -n "/$(date -d '1 hour ago' '+%H:%M:%S')/,\$p" application.log | grep 'ERROR' | awk '{print $5}' | sort | uniq -c

5.2 数据提取和转换

# 从CSV文件中提取特定列并转换格式(源文档awk示例扩展)
awk -F, '{print $1 "," $3 "," $5}' data.csv | sed 's/旧值/新值/g' > processed_data.csv# 提取网页中的链接(源文档grep示例扩展)
curl -s http://example.com | grep -o 'href="[^"]*"' | sed 's/href="//;s/"$//' | awk '!/^#/ && !/^javascript:/'# 生成格式化的文本报告(源文档awk综合示例扩展)
awk 'BEGIN {printf "序号\t名字\t部门\t年龄\n-------------------\n"} {printf "%s\t%s\t%s\t%s\n", $1, $2, $3, $4} END {printf "-------------------\n"}' employee.txt

5.3 系统监控

# 监控进程内存使用(源文档awk示例扩展)
ps aux | awk '{if($4 > 5.0) print "进程:", $11, "内存使用:", $4"%"}'# 分析磁盘使用情况(源文档awk示例扩展)
df -h | awk '/\/dev\/sd/ {print "分区:", $1, "使用率:", $5, "可用空间:", $4}'# 检查系统用户(源文档awk示例扩展)
awk -F: '$3 < 1000 {print "系统用户:", $1} $3 >= 1000 {print "普通用户:", $1}' /etc/passwd

6. 正则表达式参考

6.1 基本元字符

元字符说明
.匹配任意单个字符
*匹配前一个字符0次或多次
+匹配前一个字符1次或多次
?匹配前一个字符0次或1次
^匹配行首
$匹配行尾
[]匹配括号内的任意字符
[^]不匹配括号内的任意字符
``
()分组

6.2 字符类

字符类说明
[[:alpha:]]字母字符
[[:digit:]]数字字符
[[:alnum:]]字母数字字符
[[:space:]]空白字符
[[:lower:]]小写字母
[[:upper:]]大写字母

6.3 转义字符

转义序列说明
\n换行符
\t制表符
\s空白字符
\S非空白字符
\w单词字符
\W非单词字符
\d数字字符
\D非数字字符

7. 总结与速查

7.1 工具选择指南

  • 搜索文本:使用 grep
  • 编辑文本:使用 sed
  • 处理结构化数据:使用 awk
  • 复杂文本处理:结合使用三者

7.2 常用命令速查

awk 常用命令

awk '{print $1}' file                 # 打印第一列
awk -F: '{print $1}' file             # 指定冒号分隔符并打印第一列
awk 'NR==10' file                     # 打印第10行
awk '$1 > 100' file                   # 过滤第一列大于100的行
awk '{sum+=$1} END{print sum}' file   # 对第一列求和
awk 'BEGIN{FS=":";OFS="-"}{print $1,$3}' file # 设置输入输出分隔符并打印
awk '/pattern/{count++} END{print count}' file # 统计模式出现次数

grep 常用命令

grep pattern file                     # 基本搜索
grep -i pattern file                  # 忽略大小写
grep -v pattern file                  # 反向匹配
grep -n pattern file                  # 显示行号
grep -r pattern dir                   # 递归搜索
grep -E "pattern1|pattern2" file      # 扩展正则表达式(或)
grep -c pattern file                  # 统计匹配行数
grep -A n pattern file                # 显示匹配行及后n行

sed 常用命令

sed 's/old/new/g' file                # 全局替换
sed '/pattern/d' file                 # 删除匹配行
sed -n '10,20p' file                  # 打印10-20行
sed -i.bak 's/old/new/' file          # 直接修改文件并备份原文件
sed '/^#/d; /^$/d' file               # 删除注释和空行
sed '1,5s/old/new/g' file             # 替换1-5行的内容
sed '/pattern/a\text' file            # 在匹配行后追加文本

7.3 性能优化技巧

  • 尽量使用最简单的正则表达式
  • 在 grep 中使用 -F 选项处理固定字符串
  • 在 awk 中预先处理数据减少后续操作
  • 使用管道连接多个简单操作而不是一个复杂操作
  • 对于大文件,考虑使用 split 分割后并行处理

7.4 常见问题解决

  • 特殊字符处理:使用转义字符或不同的定界符(如 s#old#new#
  • 跨行匹配:使用 sed 的 ND 命令或 awk 的 RS 变量
  • 性能问题:优化正则表达式,减少回溯
  • 编码问题:确保终端和文件编码一致

通过掌握这三款工具的组合使用,可以解决 Linux 环境下绝大多数文本处理需求,大大提高工作效率。本文档涵盖了源文档中的主要示例和用法,并添加了选项示例,可以作为日常参考和学习的指南。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93963.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘

pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘 目录pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘引言图表1&#xff1a;Grid-Overlap-多X/Y轴示例代码解析1. 图表创建2. 多轴配置3. 图表重叠4. Grid布局效果与应用图表2&#xff1a;Gri…

【电气工程学习】

三极管中&#xff1a;集电极C,基极B&#xff0c;发射极E接线&#xff1a;棕正蓝负黑信号NPN开关输出的是我们的0V,也叫低电平PNP开关输出的是24V,也就是高电平&#xff08;NPN开关导通时&#xff0c;相当于把输出端“拉”到0V&#xff08;低电平&#xff09;&#xff0c;称为“…

【嵌入式】CAN通信

CAN 总线最初由博世于1980年代为汽车行业开发&#xff0c;能够简化复杂的布线网络&#xff0c;还确保可靠和安全的数据传输。 1.CAN技术解释 CAN网络中的每个节点&#xff0c;都是平等的&#xff0c;没有主次之分&#xff0c;这一点和SPI和I2C不同。每个节点都可以在需要的时…

Apache ShenYu网关与Nacos的关联及如何配合使用

Apache ShenYu 网关与 Nacos 之间的关系可以概括为 “协作互补”:Nacos 作为 服务注册与配置中心,为 ShenYu 提供动态的服务发现和配置管理能力,而 ShenYu 作为 流量网关,依赖 Nacos 实现路由信息的动态更新和实时生效。以下是详细解析: 1. 核心关系图解 拉取服务列表/路…

【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo

一个CPP的Library和测试程序Demo 1. 思路描述 目录结构 总控CMakeList.txt文件 2. Library代码实现 2.1 XXXLib.hpp文件(对外的接口定义文件)和XXXLib.cpp文件 2.1.1 XXXLib.hpp文件 2.1.2 XXXLib.cpp文件 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(内部的API基类) 2.2.1 CX…

【YashanDB认证】学习YashanDB的探索之路:从入门到实践

在国产数据库蓬勃发展的浪潮中&#xff0c;选择了YashanDB作为技术学习的切入点。这不仅让我深入了解了数据库的核心技术&#xff0c;也让我深刻体会到国产数据库在性能、可靠性和生态适配上的创新价值。以下是我在学习YashanDB过程中的经验与感悟。 一、YashanDB基础介绍 Ya…

element UI 和 element plus 在组件上有哪些不同

Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 组件库&#xff0c;由同一团队&#xff08;饿了么前端团队&#xff09;开发和维护。Element Plus 是 Element UI 的升级版&#xff0c;专为 Vue 3 设计&#xff0c;而 Element UI 仅支持 Vue 2。以下是它们在组件层面的主…

【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?

城市级高精度三维重建是融合多源空间数据&#xff08;遥感图像、DEM、GIS矢量等&#xff09;、计算机视觉与地理信息处理技术的复杂过程&#xff0c;核心目标是构建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真实、高精度三维场景。其流程可分为数据准备、…

【unitrix数间混合计算】3.4 无符号小数部分标记trait(bin_unsigned.rs)

一、源码 这段代码定义了一个类型级二进制小数系统&#xff0c;用于在编译时表示和验证二进制小数部分的有效性。 use crate::number::{F0, BFrac, Bit};/// 标记合法的二进制小数部分类型 pub trait BinFrac: Copy Default static {}// 空小数部分&#xff08;表示值为0&…

从一次 DDoS 的“死亡回放”看现代攻击链的进化

本文记录的是作者上周在测试环境真实踩到的坑。为了让读者能复现并亲手体验防御思路&#xff0c;文末给出了一份最小可运行的 Go 脚本&#xff0c;支持本地压测 日志回放&#xff0c;方便对比加防护前后的差异。攻击现场还原 周一凌晨 2:14&#xff0c;监控群里突然弹出告警&a…

LeetCode热题100--101. 对称二叉树--简单

1. 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a;输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a;输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 2. 题解 /*** Definition for…

Pub/Sub是什么意思

Pub/Sub&#xff08;发布/订阅模式&#xff09;​​ 是一种异步消息通信范式&#xff0c;用于分布式系统中不同组件之间的解耦通信。它的核心思想是将消息的发送方&#xff08;发布者&#xff09;​​ 和接收方&#xff08;订阅者&#xff09;​​ 分离&#xff0c;通过一个中间…

Redisson3.14.1及之后连接阿里云redis代理模式,使用分布式锁:ERR unknown command ‘WAIT‘

文章目录一、问题背景1、问题原因2、阿里云对Redisson的支持二、解决方案1、继续使用Redisson3.14.0版本2、阿里云redis改为直连模式3、升级Redisson版本到 3.47.0一、问题背景 1、问题原因 阿里云Redis分直连和代理模式&#xff0c;其中代理模式是不支持WAIT命令的。 目前尝…

Linux: RAID(磁盘冗余阵列)配置全指南

Linux&#xff1a;RAID&#xff08;磁盘冗余阵列&#xff09;配置一、RAID 核心概念 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;磁盘冗余阵列&#xff09;通过将多个物理磁盘组合为一个逻辑存储设备&#xff0c;实现提升读写性能、增强数据安全性或平衡…

《GPT-OSS 模型全解析:OpenAI 回归开源的 Mixture-of-Experts 之路》

目录 一、引言 二、GPT-OSS 模型简介 1. 版本与定位 2. 架构设计与技术亮点 2.1 Mixture-of-Experts&#xff08;MoE&#xff09;架构 2.2 高效推理机制与优化技术 2.3 模型对比 三、模型部署 1. 安装相关依赖 1.1 uv 安装 1.2 conda 安装 1.3 Transformers 运行 g…

【力扣热题100】双指针—— 接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 注意&#xff1a;答案中不可以包含重复的三元组。输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由…

51单片机拼接板(开发板积木)

一、前言 1.1 背景 读书那会儿&#xff08;2013年左右&#xff09;网上接了很多51单片机的设计。 当时有个痛点: 每张板子都是定制的&#xff0c;画板子&#xff0c;打样&#xff0c;写代码需要花费很多时间。 希望有一张板子&#xff0c;能够实现绝大多数单片机的功能&#xf…

使用segment-anything将目标检测label转换为语义分割label

使用segment-anything将目标检测label转换为语义分割label一、segment-anything简介二、segment-anything安装2.1安装方法2.2预训练模型下载三、将目标检测label转换为语义分割label3.1示例代码3.2代码说明一、segment-anything简介 segment-anything是facebookresearch团队开…

【unitrix数间混合计算】3.3 无符号整数标记trait(bin_unsigned.rs)

一、源码 这段代码是用 Rust 语言实现的一个类型级无符号二进制整数系统&#xff0c;通过类型系统在编译时表示和操作二进制数字。这是一种典型的"类型级编程"&#xff08;type-level programming&#xff09;技术。 use crate::number::{U0, Bin, Bit, BinInt};/// …

Python基本语法总结

1.类&#xff08;Class&#xff09;在Python中类&#xff08;Class&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念。1.1.类的基本定义最简单的类class Cat:"""这是一个最简单的类"""pass #创建实例 obj Cat()包含方法的类cl…