sed & awk 手写
本文为sed&awk脚本学习的手记,有些杂乱。
sed & awk 是流编辑器,也是模式匹配编程语言。
awk, sed,以及grep,源自ed,UNIX原始的行编辑器。
理解awk和sed的关键在于,
sed和awk处理的对象是流(stream),按行(line)进行处理。sed&awk的另外一个重要部分是模式匹配。流处理和模式匹配可以说是sed和awk的核心概念
,理解了这两点,sed和awk的基础就没问题了。Sed处理过程如图一所示。
图一 sed处理过程。
awk处理过程如图二所示:
图二 awk处理过程。
sed 命令基本应用格式:
sed [OPTION] ... {script-only-if-no-other-script} [input-file]...
-n 禁止sed输出到标准输出
-i 更改操作到原始文件
-e script, --expression=script
把脚本添加到执行的命令中,即一次可以执行通过-e选项执行多条命令。
-f script-file,--file=script-file
把script-file的内容添加到执行的命令中。通过脚本执行sed。
-r, --regexp-extended
使用脚本中扩展的正则表达式。
-s, -- separate
把文件看做独立的,而不是一个长的连续流。
-u,--unbuffered
如果没有-ef,--expression,-f,或者--file选项,则第一个非选项参数视为sed脚本进行解释。剩余的参数为输入的文件,如果没有输入的文件,则从标准输入读取。
awk 基本应用形式:
awk [ options ] -f program-file [ -- ] file …
其中比较常用的options的命令:
-F 指定字段分割符,例如:
awk -F ; '{ print $1}' list
$1,2,3... 行内的第几个字段指示符
-v var=value, 变量定义
变量不需要初始化,awk的变量初始化为空字符串。
对于sed的脚本而言,首先它是默认全局处理的,即对于流的每一行都会进行处理。
sed的基本命令
sed命令集含有25个命令。
sed命令格式:
[address] command
address可以是一个/正则表达式/,行号,行地址符号,或者是逗号分割的行地址范围。
个别的命令不能接受行地址范围:
[line-address] command
某些命令可以组合接受同一个地址:
[address]{
command1
command2
command3
}
可以将command1写在{行上,但是右括号(})必须单独成行。每个命令可以有自己的地址,任意层次的组合关系。
注释
#n, 等同于-n,必须是文件的前两个字符。
替换命令
[address]s/pattern/replacement/flags
flags:
n --替换掉第n个匹配项。
g --全局替换,一般是第一个匹配项
p --打印匹配空间的内容
w file -- 将模式匹配内容写到file。
和地址不一样,正则表达式除了新行符外都可以作为分隔符。如:
s!/usr/mail!/usr2/mail!
在replacement部分,以下字符有特殊含义:
& 指代正则表达式的匹配的字符串(pattern)
\n 匹配pattern指明的第n个子字符串,通过括号(),最多可以指定9个,n为1-9的数字
\ 转义符
删除命令
d
/^$/d 删除空白行
增加,插入和修改
append[line-address]a\
text
insert[line-address]i\
text
change[address]c\
text
list命令
显示模式空间的内容,对于不能打印的字符用2进制ASCII码表示。
转换命令
y
打印命令
p
打印行号
地址后面跟一个=,打印行号
[line-number]=
next 命令
n
读写文件
[line-address]r file
[address]w file
quit命令
停止命令q
高级sed命令
所谓sed的高级命令,可以理解为sed的扩展,因为sed本质上是行处理的流编辑器,但是也有跨行处理,指令控制的需求,因此所谓的高>级命令就是使sed可以进行多行处理,缓存处理行空间,以及分支和条件处理的指令。
1. 多行模式
N,D,P
2. 缓存一行
H,h,G,g, x
3. 分支处理和条件处理,:,b,t
awk 脚本
awk语言是属于POSIX标准的。原始的awk是一种漂亮的小语言,1978年左右在UNIX V7中出现。1989年,awk 为 System V Release 4进行
了更新。这一版也提供了POSIX标准的基准功能列表。
awk 是输入驱动的。
系统数组变量
ARGV, 参数数组
ENVIRON, 环境变量数组