sed 的使用
sed
的全称是 Stream Editor,即流编辑器。它可以逐行处理输入数据(先将读入的行放到缓冲区中,对缓冲区里的内容进行处理),并将处理结果输出到标准输出。
格式:sed [选项] [address]{脚本命令(块)} 文件名 前缀 address 可以是数字或者文本(正则),格式:[address]脚本命令 或 address {多个脚本命令}
选项 | 含义 |
---|---|
-e | 串联多个操作指令(复杂操作建议用分号分隔指令或使用多个-e) |
-f | 选项会将其后文件中的脚本命令添加到已有的命令中。 |
-n | 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。 |
-i | 此选项会直接修改源文件,要慎用。 |
- sed s 替换脚本命令 :s/pattern(可以使用正则表达式)/replacement/flags
- sed d 删除脚本命令 :如果不指定具体行,文件中的所有内容都会被删除
- sed a 和 i 插入脚本命令: a 命令表示在指定行的后面插入一行,i 命令表示在指定行的前面插入一行
- sed c 替换行命令: 用于将匹配到的整行内容替换为指定的新内容: sed '[地址]c 新内容' 输入文件- sed y 单字符转换命令: y/inchars/outchars/. y 转换命令是唯一可以处理单个字符的 sed 脚本命令
- sed p 打印脚本命令: p 命令表示搜索符号条件的行,并输出该行的内容(-n选项和p命令配合使用可以禁止输出其它行,只打印包含匹配文本模式的行)
- sed w 脚本命令 : w 命令用来将文本中指定行的内容写入文件中
- sed r 读取文件命令: r 命令用于将一个独立文件的数据插入到当前数据流的指定位置
在 sed 编辑器中,有两个非常重要的概念:保留空间(hold space)和模式空间(pattern space)
- 保留空间
- 保留空间是 sed 的第二个缓冲区,它允许 sed 在处理模式空间的内容时保存数据。
- 保留空间可以用来存储模式空间中当前行的副本,或者用于在不同行之间传递数据。
- 模式空间
- 模式空间是 sed 用来处理输入文本的地方。
- 当 sed 读取输入文件的每一行时,它会将这一行放入模式空间,然后对模式空间中的内容执行指定的编辑命令。
- 默认情况下,模式空间的内容在处理后被输出到标准输出(通常是屏幕)。
- 模式空间的大小通常受限于系统内存,但通常足够处理单行文本。
awk 的使用
更适合格式化文本,对文本进行较复杂格式处理
格式:awk [选项] [address]{脚本命令(块)} 文件名
选项 | 含义 |
---|---|
-F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。 |
-f file | 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。 |
-v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。 |
awk 正则有几种使用方法
1.直接当做条件 awk '/正则/{执行语句}' file 表示只对能够匹配正则的行执行后面的语句, !/正则/ 则是不匹配时执行
2.对某个列进行判断 awk '$1 ~ /正则/ {执行语句}' file 表示第一列如果匹配正则,对该行进行处理。也可以用 ~! 或 !~ 表示不匹配时进行处理。第一种情况相当于 $0 ~ /正则/
3.分隔符使用正则, 在awk的-F参数后可以直接使用正则表达式 表示能够匹配的都当做分隔符;awk中设置 其他分隔符 如FS、RS等也可以使用正则
4. 几个拆分函数:
如split(s,a,fs),用fs将s分成序列a,其中fs就可以用正则;几个替换函数:
如gensub(a,b,c[,d])等也可以包含正则表达式,例如:gensub(/123/,"x",1,$1)替换$1中 第一次匹配到的123为字符x,返回值为$1替换后的内容,且$1的内容并没有改变等等
如gsub(r,s)在整个$0中用s替代r; gsub(r,s,t)在整个t中用s替代r
awk的内建变量
$0:代表整行内容
$1:第几个字段
NF:当前行的字段数
NR:行号
FS:字段分隔符
OFS:输出的字段分隔符
RS:记录分隔符/行分隔符,默认 \n
ORS:输出的记录分隔符/行分隔符
shell脚本变量的含义
S#: 表示执行脚本传入参数的个数
*: 表示执行脚本传入参数的列表(不包括0)
$$: 表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
$!: Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
@ : 表示执行脚本传入参数的所有个数(不包括0)
$0: 表示执行的脚本名称
$1: 表示第一个参数
$2: 表示第二个参数
$?: 表示脚本执行的状态,0表示正常,其他表示错误