Shell 语法摘要
sed 的使用
sed:擅长对「整行」做增删改查(流编辑器,行处理)
格式:sed [选项] '[地址]{命令}' file
1. 组成拆分
① [选项 OPTIONS] 常见高频
-n:只输出匹配行(取消默认打印所有行)
-i:原地修改文件(GNU sed)
-e:多个脚本表达式,多条命令
-f:从文件读取 sed 脚本
② [地址] 地址定位(重点)
用来限定命令作用在哪一行,分为单行地址 / 区间地址
| 地址写法 | 含义 |
|---|---|
| 1 | 第 1 行 |
| $ | 最后一行 |
| 3,7 | 3~7 行 |
| 3,$ | 第 3 行到末尾 |
| /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)
- 保留空间
- 保留空间是 sed 的第二个缓冲区,它允许 sed 在处理模式空间的内容时保存数据。
- 保留空间可以用来存储模式空间中当前行的副本,或者用于在不同行之间传递数据。
- 模式空间
- 模式空间是 sed 用来处理输入文本的地方。
- 当 sed 读取输入文件的每一行时,它会将这一行放入模式空间,然后对模式空间中的内容执行指定的编辑命令。
- 默认情况下,模式空间的内容在处理后被输出到标准输出(通常是屏幕)。
- 模式空间的大小通常受限于系统内存,但通常足够处理单行文本。
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
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号