Shell 语法摘要
sed 和 awk 的使用场景
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 批量替换文本 | sed | s/old/new/g 简洁高效 |
| 删除特定行 | sed | /pattern/d 一行搞定 |
| 提取某几列数据 | awk | $1, $2, $NF 天然支持 |
| 条件过滤 + 计算 | awk | 支持数学运算和复杂逻辑 |
| 生成报表 | awk | printf 格式化输出 |
| 日志分析统计 | awk | 字段提取 + 聚合计算 |
sed 的使用
sed:擅长对「整行」做增删改查(流编辑器,行处理)
格式:sed [选项] '[地址]{命令}' file
1. 组成拆分
① [选项 OPTIONS] 常见高频
-n:只输出匹配行(取消默认打印所有行)
-i:原地修改文件(GNU sed)
-e:多个脚本表达式,多条命令
-f:从文件读取 sed 脚本
② [地址] 地址定位(重点)
用来限定命令作用在哪一行,分为单行地址 / 区间地址
| 地址写法 | 含义 |
|---|---|
| 1 | 第 1 行 |
| $ | 最后一行 |
| 3,7 | 3~7 行 |
| 3,$ | 第 3 行到末尾 |
| /regex/ | 匹配正则的行 反向匹配:/regex/! |
| /start/,/end/ | 从匹配 start 行到匹配 end 行 |
③ {命令块} 多条命令集合
当需要同一地址执行多条 sed 指令,用大括号 {} 包裹,命令用分号分隔
# 匹配行同时做替换+打印
sed '/apple/{s/apple/orange/g;p}' file
- sed s 替换脚本命令 :sed 's/old/new/' test.txt
- sed d 删除脚本命令 :如果不指定具体行,文件中的所有内容都会被删除
- sed a 和 i 插入脚本命令: a 命令表示在指定行的后面插入一行,i 命令表示在指定行的前面插入一行
- sed c 替换行命令: sed '2c hello' test.txt (将第 2 行整行替换为 hello)注意:把匹配到的整一行内容全部删掉,完整替换成新文字
- sed y 单字符转换命令: y/inchars/outchars/ 注意:严格一对一字符对应,前后两个字符串长度必须一模一样,长度不一致直接报错
- sed p 打印脚本命令: p 命令表示搜索符号条件的行,并输出该行的内容(-n选项和p命令配合使用可以禁止输出其它行,只打印包含匹配文本模式的行)
- sed w 脚本命令 : w 命令用来将文本中指定行的内容写入文件中
- sed r 读取文件命令: r 命令用于将一个独立文件的数据插入到当前数据流的指定位置
在 sed 编辑器中,有两个非常重要的概念:保留空间(hold space)和模式空间(pattern space)
一、两个空间本质
模式空间 PS(干活的前台)
sed 默认逐行读取文件内容,数据先放进模式空间,所有常规匹配、替换、打印、删除(s///、p、d)全都在这块区域操作。
每行处理完毕,默认打印模式空间内容,之后清空,读取下一行。
生命周期:读取一行 → PS 处理 →(默认输出)→ PS 清空 → 读取下一行
保持空间 HS(储物的后台柜子)
一块独立、默认空白的临时存储空间。sed 不会主动读写这里,必须靠手动命令搬运数据。
不会随每行读取自动清空,数据会一直留存,直到你主动覆盖 / 修改。
作用:跨行数据处理、缓存文本、倒序、拼接多行内容。
二、6 条核心搬运命令(PS ↔ HS)
| 命令 | 动作说明 |
|---|---|
| h | 覆盖写入:模式空间 → 保持空间(HS 原有内容直接被覆盖) |
| H | 追加写入:模式空间 → 保持空间,自动加分隔换行 |
| g | 覆盖取回:保持空间 → 模式空间,清空原有 PS 内容 |
| G | 追加取回:保持空间内容追加到 PS 末尾,自带换行 |
| x | 交换:模式空间、保持空间两者内容互换 |
简写记忆:
h=hold 存进去,g=get 取出来;大写是追加,小写是覆盖
awk 的使用
awk:擅长把行切分成「列」,做筛选、统计、计算(文本分析语言)
格式:awk [选项] '[模式]{动作}' file
一、和 sed 结构类比(方便记忆)
pattern 模式 ≈ sed 的 address 地址条件
action 动作块 ≈ sed 的命令块
二、常用选项(Options)
| 选项 | 含义 |
|---|---|
| -F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符(\t)。 |
| -f file | 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。 |
| -v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。 |
三、[PATTERN] 模式(筛选哪些行执行 {} 内动作)
没有模式 → 所有行执行动作
常见模式写法:
1.行范围(行号)
awk 'NR==1{print}' file # 仅第1行
awk 'NR>=2 && NR<=5{print}' file # 2~5行
awk 'NR==END{print $0}' # 最后一行
2.正则匹配 / 正则 /
awk '/error/{print $0}' log.txt # 包含error的行
awk '!/warn/{print}' log.txt # ! 取反,不包含warn
awk '$4 ~ /\[18\/Jul\/2026/ {count++} END {print count}' access.log # 作用:统计 Nginx/Apache 访问日志 中,2026年7月18日这一天的总访问次数。 字符串 “~”匹配运算符(匹配正则)
3.条件表达式(> < == && ||)
awk '$3>100{print $1,$3}' data.txt
4.特殊内置模式:BEGIN / END
BEGIN{}:读取文件之前执行(只运行一次,不能访问文件行数据)
END{}:全部文件读取完成后执行(常用于汇总、统计)
awk 'BEGIN{print "开始统计"}; $2>10{sum+=$2}; END{print sum}' test.txt
四、{ACTION} 动作代码块
多条语句使用 ** 分号 ;** 分隔
awk 'NR<=3{print $1;print $2}' file
常用动作:
1. print $0 打印整行;print $1 $2 打印第 1、2 列
2. if(){}else{} 判断
3. for() 循环
4. 变量运算、数组
五、核心内置变量(面试必考)
| 变量 | 含义 |
|---|---|
| $0 | 完整当前行文本 |
| $1 $2 $n | 第 1 列、第 2 列、第 n 列 |
| NF | Number of Field,当前行总列数;$NF 最后一列 |
| NR | 全局行号(多个文件持续累加) |
| FNR | 单个文件内的行号,新文件重置为 1 |
| FS | 字段分隔符,等价于 -F |
| OFS | 输出字段分隔符,默认空格 |


shell脚本变量的含义
S#: 表示执行脚本传入参数的个数
*: 表示执行脚本传入参数的列表(不包括0)
$$: 表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
$!: Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
@ : 表示执行脚本传入参数的所有个数(不包括0)
$0: 表示执行的脚本名称
$1: 表示第一个参数
$2: 表示第二个参数
$?: 表示脚本执行的状态,0表示正常,其他表示错误


浙公网安备 33010602011771号