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)
  1. 保留空间
  • 保留空间是 sed 的第二个缓冲区,它允许 sed 在处理模式空间的内容时保存数据。
  • 保留空间可以用来存储模式空间中当前行的副本,或者用于在不同行之间传递数据
  1. 模式空间
  • 模式空间是 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 输出字段分隔符,默认空格

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_六  阅读(20)  评论(0)    收藏  举报