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 输出字段分隔符,默认空格

image
image

shell脚本变量的含义

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

img

posted @ 2025-09-11 16:40  maroon_六  阅读(21)  评论(0)    收藏  举报