news 2026/4/18 0:47:49

三剑客的使用(sed,awk,cut)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三剑客的使用(sed,awk,cut)

一、sed

sed(Stream EDitor)是 Linux/Unix 系统下一个非常强大且常用的流编辑器。它主要用于对文本进行过滤和转换,特点是按行处理

1、使用文件名1.txt,文件内容为
old new old old old old old old old OLD OLD OlD OLd oLD jaslkdja
2、基本语法
sed [选项] ‘命令’ 文件名 例: [root@qian ~]# sed 's/old/new' 1.txt new new new old old old old old new OLD OLD OlD OLd oLD jaslkdja 使用管道: 其他命令 | sed [选项] '命令' 例: head 1.txt | sed 's/old/new' 1.txt
3、替换命令
sed 's/old/new/g' 1.txt 默认值,只替换每行的第一个匹配 首字符: s:替换 末字符: g:全局替换 i:忽略大小写 数字:表示替换第几个匹配项 ​ 1.将所有的old都替换成new,精确匹配 sed 's/old/new/g' 1.txt ​ 2.仅替换每行第一个old为new sed 's/old/new/' 1.txt ​ 3.忽略大小写把所有的old都替换成new sed 's/old/new/ig' 1.txt ​ 4.将全文的第四个匹配项的old替换成new [root@qian ~]# sed 's/old/new/4' 1.txt old new old old old new old old old OLD OLD OlD OLd oLD jaslkdja
4、直接修改文件(-i)
1.将所有的old都替换成new,精确匹配 [root@qian ~]#sed -i 's/old/new/g' 1.txt 静默输出 [root@qian ~]#cat 1.txt ​ 2.将全文的第四个匹配项的old替换成new sed 's/old/new/4' 1.txt [root@qian ~]# cat 1.txt old new old old old new old old old OLD OLD OlD OLd oLD jaslkdja
5、删除文件中的内容(d)
1.删除文件中的第四行 sed -i '4d' 1.txt ​ 2.删除文件中的最后一行 sed -i '$d' 1.txt ​ 3.删除所有空白行 sed '/^$/d' 1.txt 或 sed '/^[[:space:]]*$/d' 1.txt 其中空白行有空格或制表符 ​ 例: [root@qian ~]# sed '/^[[space::]]/d' 1.txt old new old old old new old old old OLD OLD OlD OLd oLD [root@qian ~]# sed '/^[[:space:]]/d' 1.txt old new old old old new old old old OLD OLD OlD OLd oLD ​ 4.删除包含字符串的行 sed '/error/d' 1.txt
6、打印到终端页面(p)
通常与 -n(静默模式,不打印所有行)一起使用 1.查看文件的第5行到第10行 sed -n '5,10p' 1.txt ​ 2.查看只包含error的行,类似grep sed -n '/error/p' 1.txt
7、追加(a)和插入(i)
a\:在指定行之后追加文本。 1.在第2行插入一行“error is not bad” sed '2a\error is not bad' 1.txt ​ i\:在指定行之前插入文本。 2.在第3行前插入“success is good” sed '3i\success is good' 1.txt ​ 3.在最后一行之后追加“---END---” sed '$a\---END---' 1.txt ​ 4.在所有包含“server {”之后的行追加“listen 8080” sed '/server {/a\ listen 8080;' 1.txt
8、高阶用法
1.使用-e选项执行多个命令,或者用分号;分隔 sed -e 's/old/new/g' -e '/server/d' 1.txt 或 sed -e 's/old/new/g;/server/d' 1.txt ​ 2.使用正则表达式 默认使用BRE,使用-r或者-E(取决于系统),来启用扩展正则表达式。 可以直接使用 + , ? , | , ()等字符不用转义 使用扩展正则表达式匹配1个或多个数字 sed -r 's/[0-9]+/NUM/g' 1.txt 如果不使用-r参数,需写成 sed -r 's/[0-9]\+/NUM/g' 1.txt ​ 3,反向引用 在替换模式中使用 \( 和 \) 分组,然后用 \1, \2 等来引用它们。 echo "Hello World" | sed 's/\(.*\) \(.*\)/\2 \1/' 或 echo "Hello World" | sed -r 's/(.*) (.*)/\2 \1/'
9、经典场景速查表
场景命令
全局替换sed 's/old/new/g' file
删除空白行sed '/^$/d' file
显示特定行sed -n '10p' file(显示第10行)
删除包含模式的行sed '/pattern/d' file
在行前插入sed '5i\new line' file(在第5行前插入)
在行后追加sed '/pattern/a\new line' file(在匹配行后追加)
直接修改文件sed -i 's/old/new/g' file
备份并修改sed -i.bak 's/old/new/g' file
调换两列数据sed -r 's/([^ ]*) ([^ ]*)/\2 \1/' file

二、awk

awk 是一款功能强大的文本处理和数据分析工具,它不仅仅是命令,更是一门编程语言。它的设计初衷是用于处理结构化文本数据(如日志、CSV文件等),其核心思想是基于列和模式匹配进行处理。

此次文件为awk.txt [root@qian ~]# cat awk.txt 1 /usr/lib/systemd/systemd 2 [kthreadd] error is not bad
1、基本语法:
awk '模式 {动作}' 文件名 例: 将1.txt文件中第二列和第十一列数据输出到终端上 awk '{print $2, $11}' 1.txt ​ 使用管道 其他命令 | awk '模式 {动作}' 例: 打印第2列(PID)和第11列(COMMAND)数据到终端上 ps aux | awk '{print $2, $11}'
2、核心概念:
1.记录与字段 记录:默认一行就是一条记录 字段:默认以空格或制表符为分隔符,将每条记录分割成多个字段。 $0:代表整条记录。 $1:代表第一个字段。 $2:代表第二个字段。 ... 以此类推。 $NF:代表最后一个字段。 ​ 2.内置变量 FS:输入字段分隔符,默认为空格。 OFS:输出字段分隔符,默认为空格。 RS:输入记录分隔符,默认为换行符。 ORS:输出记录分隔符,默认为换行符。 NF:当前记录中的字段数量。 NR:当前处理的记录号(行号)。 FNR:当前文件的记录号(处理多个文件时与NR不同)。 ​ 3.工作流程 BEGIN { ... }:在处理任何输入行之前执行一次。 模式 { ... }:对于匹配模式的每一行,执行动作。 END { ... }:在处理完所有输入行之后执行一次。
3、日常使用
1.打印最后一列 awk '{print $NF}' 1.txt ​ 2.打印倒数第二列 awk '{print $(NF-1)}' 1.txt ​ 3,打印第一列大于100的行 awk '$1 > 100' 1.txt ​ 4.打印awk.txt中第一个数字为1的行 [root@qian ~]# awk '$1 ==1' awk.txt 1 /usr/lib/systemd/systemd ​ 5.打印包含“error”关键字的行 [root@qian ~]# awk '/error/' awk.txt error is not bad ​ 6.打印第1列包含 "" 或者 第2列等于0的行 awk '$2 ~ /usr/ || $2 == 0' awk.txt ​ 7.打印第2列大于50 并且 第3列小于100的行 awk '$2 > 50 && $3 < 100' awk.txt
4、NR和FNR的使用
1.打印第9行到第10行 [root@qian ~]# awk 'NR>=9 && NR<=10' awk.txt 2 [kthreadd] error is not bad ​ 2.打印文件第一行(表头) awk 'NR==1' awk.txt
5、计算与统计
1.计算文件行数 awk 'END {print NR}' awk.txt ​ 2.对第三列求和 awk '{sum += $3} END {print sum}' awk.txt
6、修改输出格式,使用OFS和printf
1.改变输出分隔符(例如,用冒号连接字段) awk -v OFS=':' '{print $1, $2, $3}' awk.txt # 或者使用 BEGIN 块 awk 'BEGIN {OFS=":"} {print $1, $2, $3}' awk.txt ​ 2.格式化输出 将第一列左对齐,宽度10,第二列右对齐,宽度5 awk '{printf "%-10s %5d\n", $1, $2}' awk.txt
7、高阶用法
1.指定分隔符(-F) 由于/etc/passwd里的数据都是由:组成 root:x:0:0:root:/root:/bin/bash cat /etc/passwd | awk -F':' '{print $1,$2,$3}' root x 0 ​ 2.使用多个分隔符 awk -F'[ :]' '{print $1, $3}' /etc/passwd ​ 3.在代码中指定分隔符 awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
8、经典场景速查表
场景命令
打印特定列awk '{print $1, $3}' file
打印最后一列awk '{print $NF}' file
过滤第一列大于10的行awk '$1 > 10' file
过滤包含"error"的行awk '/error/' file
打印行号awk '{print NR, $0}' file
计算行数awk 'END{print NR}' file
对第一列求和awk '{sum+=$1} END{print sum}' file
处理CSV文件awk -F',' '{print $2}' file.csv
修改输出分隔符awk -v OFS='\t' '{print $1, $2}' file
打印第5到第10行awk 'NR>=5 && NR<=10' file

三、grep

grep(Global Regular Expression Print)是 Linux/Unix 系统下最常用、最强大的文本搜索工具。它的核心功能就是在一个或多个文件中,按照给定的模式(字符串或正则表达式)进行搜索,并打印出匹配的行。

1、基本语法
grep [选项] '搜索模式' [文件...] 例: 搜索出message日志中error字段的数据 grep 'error' /var/log/messages ​ 或 使用管道 cat /var/log/messages | grep 'error'
2、忽略大小写(i)
grep -i 'error' /var/log/messages
3、反向搜索(v)
查找message日志中除了success字段的数据 grep -v 'success' /var/log/messages ​ 结合管道,过滤掉注释行(以#开头)和空行 grep -v '^#' /etc/selinux/config | grep -v '^$'
4、显示行号(n)
grep -n 'disabled' /etc/selinux/config
5、统计匹配行数(c)
grep -c 'disabled' /etc/selinux/config
6、递归搜索(r)
在当前目录及所有子目录的 .java 文件中搜索 "ArrayList" grep -r 'ArrayList' . ​ 在当前目录及所有子目录的 .java 文件中搜索 "ArrayList" grep -r 'ArrayList' .
7、只显示匹配部分(o)
[root@qian ~]# grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' awk.txt 15235233442@163.com
8、显示上下文
1.-A NUM:显示匹配行之后的 NUM 行。 搜索 "Exception",并显示其后5行(通常包含堆栈跟踪信息) grep -A 5 'Exception' app.log ​ 2.-B NUM:显示匹配行之前的 NUM 行。 搜索 "error",并显示其后4行 grep -B 4 'error' app.log ​ 3.-C NUM:显示匹配行前后的 NUM 行。 搜索panic,并输出前后3行 grep -C 3 'panic' kernel.log
9、正则表达式搜索(-E或egrep)
1.搜索多个模式 grep -E 'error|warning' logfile.txt ​ 2.匹配一个或多个() ​ 3.匹配特定次数的重复 # 匹配10位数字(例如手机号) grep -E '[0-9]{10}' logfile.txt
10、常用的正则表达式
^pattern:匹配以 pattern 开头的行。 ​ pattern$:匹配以 pattern 结尾的行。 ​ ^$:匹配空行。 ​ .:匹配任意一个字符。 ​ *:匹配前一个字符0次或多次。 ​ .*:匹配任意字符任意次数(通配)。 ​ [abc]:匹配 a, b, 或 c 中的任意一个字符。 ​ [^abc]:匹配除了 a, b, c 之外的任何字符。 ​ [0-9]:匹配任意数字。 ​ [a-zA-Z]:匹配任意字母。
11、经典场景速查表
场景命令
基本搜索grep 'hello' file.txt
忽略大小写grep -i 'hello' file.txt
显示行号grep -n 'hello' file.txt
统计出现次数grep -c 'hello' file.txt
反向搜索grep -v 'world' file.txt
递归搜索目录grep -r 'main' /path/to/code/
只显示匹配部分grep -o '[0-9]*' file.txt
搜索多个模式grep -E 'err|warn' file.txt
搜索以...开头的行grep '^Starting' file.txt
搜索以...结尾的行grep 'end$' file.txt
查找空行grep '^$' file.txt
显示匹配行前后内容grep -C 2 'crash' file.txt
在压缩文件中搜索zgrep 'error' /var/log/syslog.1.gz
12、实用组合与技巧
1.管道组合 查找特定进程 ps aux | grep 'nginx' ​ 分析日志 # 统计某个API接口被调用的次数 grep 'GET /api/user' access.log | wc -l # 找到最近的错误,并查看其上下文 tail -100 app.log | grep -C 5 -i 'exception' ​ 2.压缩文件中搜索(zgrep,zcat) 注:.gz压缩文件,无需解压即可搜索 zgrep 'error' /var/log/syslog.2.gz # 或者 zcat file.gz | grep 'pattern' ​ 3.固定单词匹配 -w grep -w 'is' file.txt # 会匹配 "is",但不会匹配 "this" 或 "island" ​ 4.静默模式 -q 不输出任何内容,只根据是否匹配到返回退出状态码($?为0表示匹配成功)。常用于脚本判断。 if grep -q 'critical error' logfile.txt; then echo "发现严重错误!" exit 1 fi
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 12:06:31

PaddlePaddle FCN与UNet对比:图像分割经典架构分析

PaddlePaddle FCN与U-Net对比&#xff1a;图像分割经典架构分析 在自动驾驶感知系统中&#xff0c;不仅要识别出“前方有行人”&#xff0c;更要精确勾勒出行人轮廓&#xff1b;在医学影像诊断里&#xff0c;模型需要从CT切片中精准分割出肿瘤区域——这些任务的核心&#xff0…

作者头像 李华
网站建设 2026/4/10 21:49:33

PaddlePaddle条形码二维码识别:零售行业效率提升

PaddlePaddle条形码二维码识别&#xff1a;零售行业效率提升 在一家繁忙的连锁便利店&#xff0c;收银台前排起了长队。顾客手中商品的条形码因包装褶皱、反光或轻微倾斜&#xff0c;导致传统扫码枪多次识别失败&#xff0c;店员不得不手动输入编码——这不仅拖慢了结账速度&a…

作者头像 李华
网站建设 2026/4/9 10:14:10

PaddlePaddle开发者认证指南:如何成为官方认可专家?

PaddlePaddle开发者认证指南&#xff1a;如何成为官方认可专家&#xff1f; 在AI技术加速落地的今天&#xff0c;企业对具备实战能力的深度学习工程师需求激增。然而&#xff0c;面对TensorFlow、PyTorch等国际主流框架&#xff0c;许多开发者发现&#xff0c;在处理中文NLP任务…

作者头像 李华
网站建设 2026/4/3 2:40:14

PaddlePaddle车牌识别LPR:智能交通管理系统核心

PaddlePaddle车牌识别LPR&#xff1a;智能交通管理系统核心 在城市道路日益拥堵、车辆保有量持续攀升的今天&#xff0c;如何高效准确地“看懂”每一辆车的身份信息&#xff0c;已成为智慧交通系统的关键命题。尤其是在高速公路收费站、小区出入口、违章抓拍摄像头等场景中&am…

作者头像 李华
网站建设 2026/4/16 13:30:48

ESP32连接SSD1306使用I2C:零基础实现显示

从零点亮一块OLED屏&#xff1a;手把手教你用ESP32驱动SSD1306 你有没有过这样的经历&#xff1f;买了一个SSD1306 OLED屏&#xff0c;插上ESP32却死活不亮。串口打印“初始化失败”&#xff0c;查遍资料还是摸不着头脑——到底是线接错了&#xff1f;地址不对&#xff1f;还是…

作者头像 李华
网站建设 2026/4/17 20:35:37

Raspberry Pi 4搭载Batocera游戏整合包的游戏体验全面讲解

用 Raspberry Pi 4 打造一台“即插即玩”的复古游戏机&#xff1a;Batocera 实战全解析 你是否还记得小时候守在电视机前&#xff0c;握着红白机手柄等《超级马里奥》加载的那份期待&#xff1f;如今&#xff0c;只需一张 SD 卡、一块树莓派和一个旧手柄&#xff0c;就能把整个…

作者头像 李华