You are on page 1of 24

第四章

文件编辑和流处理
第四章 文件编辑和流处理 ----ed

 一、 ed 行编辑器
 1970 年由 Ken Thompson 编写
 优点: 1 )运行环境要求底,是 UNIX 系统最基本的编辑器; 2 )
编辑命令功能强大,至今仍然使用; 3 ) ed 提供的正则表达式广泛
使用; 4 )运行速度很快。
 1.1 基本命令
a 从当前行开始添加

. 结束添加状态
 // 必须在行首输入
w 存盘

q 退出 ed 编辑器

第四章 文件编辑和流处理 ----ed

 1.2 临时进入 shell !


 1.3 显示命令 p
p
 显示当前行
5
 将当前行改为第 5 行并显示当前行
m , np 显示 m 到 n 行

. 代表当前行, $ 代表最后一行

可使用相对行,如 .,.+3p $-5,$p . 加偏移量时可以省略。


 1.4 查找
/ 模式 / 查找下一个匹配模式的行,遇到尾行则从首行开始

? 模式 ? 查找上一个匹配模式的行,遇到首行则从尾行开始

第四章 文件编辑和流处理 ----ed
// 重复查找下一个匹配模式的行,模式不变

?? 重复查找上一个匹配模式的行,模式不变

查找会改变当前行

查找返回的是行号,可使用。

1,/main/p
 显示 1 到第一次出现 main 的行
/main/-1,$p
 显示第一次出现 main 的行的上一行到最后一行
5,?int?d
 删除 5 到最后一次出现 int 的行

1.5 插入、删除、撤销

na 从 n 行后添加

ni 从 n 行前插入。 i 、 a 都以行首 . 来结束


m,nd 删除 m 至 n 行

u 撤销所做的编辑

第四章 文件编辑和流处理 ----ed

 1.6 替换
s/old/new/ 把当前行中第一个 old 替换为 new

s/old/new/g 把当前行中每一个 old 都替换为 new


1,$ s/old/new/g 把文件中所有的 old 都替换为 new


速记符 &

 1 , $s/big/very &/g 把文件中的 big 都替换为 very big


 s/and/\&/ 把 and 改为 &
第四章 文件编辑和流处理 ----ed

 1.7 ed 的正则表达式
c 普通字符,与自己匹配,如 a 、 b 等
\c 取消字符 c 的特殊意义,如 \&
^ 在模式起始位置时,代表行首。如 ^a 表示行首为 a
$ 在模式结束位置时,代表行尾。
. 匹配任意单个字符。
[…] 匹配 [] 中任意单个字符,如 [1ac] , [a-z], [1-9]
[^…] 匹配不在…中的任意单个字符
r* ,零个或多个重复的 r , r 为单个字符。如 a*, [ab]*, .*
& 仅用于替换命令 s 的右边,代表第一个模式
第四章 文件编辑和流处理 ----ed

 模式举例
/^$/ 空行

/./
 非空行
/^/
 任意行
/thing/ 包含字符串 thing 的行

/^thing/ 以 thing 开始的行


/thing$/
 以 thing 结尾的行
/^thing$/ 内容为 thing 的行

/thing.$/ 以 thing 加任意符号结尾的行


/thing\.$/ 以 thing. 结尾的行


/\/thing\// 包含 /thing/ 的行

第四章 文件编辑和流处理 ----ed

/[tT]hing/ 包含 thing 或 Thing 的行


/thing[0-9]/

/thing[^0-9]/

/thing[0-9][^0-9]/

/thing1.*thing2/

/^thing1.*thing2$/

第四章 文件编辑和流处理 ----ed

 1.8 全局命令
命令格式: m,ng/re/cmd ,含义是从 m 行到 n 行中对于匹配 re 模式的
行执行命令 cmd. 如果作用范围是全文件 (1,$) , m 、 n 可以省略。
 g/…/p 显示所有包含…的行
 g/…/d 删除所有包含…的行
 g/…/s//rep1/ 对于包含…的行,将其中第一个替换成 rep1
 g/…/s//rep1/g 把所有的…替换成 rep1
 g/…/s/pat/rep1/ 对于包含…的行,将其中第一个 pat 替换成 rep1
 v/^$/p 打印所有非空行
第四章 文件编辑和流处理 ----ed

 1.9 移动、复制
命令格式: m,nmd m 到 n 行移到 d 行之后。
 m,ntd m 到 n 行拷贝到 d 行之后
 g/^/m0 执行结果?
第四章 文件编辑和流处理 ----sed

 二、 sed---- 流编辑器
 直接从 ed 发展而来,用于处理输出流,常用于管道中。
 命令的一般形式 sed -[opt] 'ed command1;ed command2' file.
sed 从输入文件中依次读取每一行,按指定的 ed 命令处理,将结果
送至标准输出。
 $ sed 's/UNIX/Linux/g' file 将 file 中的 UNIX 替换成 Linux 显示在
屏幕上,但不改变 file 本身。
 $ who | sed 's/ .*//' 显示当前登录用户,只显示用户名。
 $ who am i |sed 's/ .*//' 获取我的登录名 .
 $ sed '10q' file 显示 file 文件的前 10 行
第四章 文件编辑和流处理 ----sed

 $ sed '/pattern/d' file 不显示包含 pattern 的行。


 $ sed -n '/pattern/p' file 仅显示包含 pattern 的行。 sed 默认显示
每一行, -n 选项关闭自动显示功能。 sed -n ‘/pattern/p’ file 具有过
滤功能,与 grep pattern file 功能相同。
 $ ls -l | sed -n '/^d/p' 长格式列出当前目录下的子目录
 $ 列出当前目录下的子目录

 sed 的局限性 由于 sed 处理的是输入流,一旦读入一行,前面的


行就过去了,无法再次取回,因此 sed 不具备行运算的能力。例如
$ sed '$-1d' 是非法的
第四章 文件编辑和流处理 ---- 过滤器

 三、过滤器
 3.1 grep
$ grep pattern file pattern: ed pattern
$ grep '^void' sig.c 显示 sig.c 文件中以 void 开头的行
$ ls -l | grep '^d' 列出当前目录下的子目录
$ ls -l | grep '^d' | sed 's/.* //' 列出当前子目录名

grep 的兄弟 : fgrep 、 egrep 。 fgrep 功能较弱,但处理大文件的能力


强, egrep 使用扩展正则表达式,功能强大。
第四章 文件编辑和流处理 ---- 过滤器

 3.2 sort---- 排序
$ ls | sort

 3.3 tail 、 head


$ tail file 显示 file 的最后 10 行

$ tail -5 file 显示 file 的最后 5 行


$ head file 显示 file 的前 10 行


$ head -5 file 显示 file 的前 5 行



第四章 文件编辑和流处理 ----awk

 四、模式匹配与处理语言 awk
 一般使用形式:
$ awk 'program' filename

$ commd | awk 'program '


program 的形式

pattern1 {action1} pattern2{action2}……// 模式之间为“或”的关系


pattern: ed 的正则表达式,逻辑表达式

action :如 print 、 printf 等


 缺省
$ awk '/pattern/' file 显示匹配模式的每一行,功能同 grep

$ awk '{print}' 显示每一行,功能同 cat


例: awk '//' sig.c awk '{print}' sig.c awk '//{print}/main/{print


"----------------------------"}' sig.c
第四章 文件编辑和流处理 ----awk

 记录、字段
每一行为一条记录, NR 为记录数

每一个非空的字符串为一个字段,使用 $1 、 $2 、…标记, $0 为整行


, NF 为字段数
$ awk '{print NR, $0}' file 显示 file ,并在行首加上行号

$ ls -l | awk '/^d/{print}' 长格式列出当前目录下的子目录


$ ls -l | awk '/^d/{print $8}' 列出当前目录下的子目录


 打印(显示)
$ ls -l | awk '{print NR, ": " $1, $8}'

$ awk '{printf("%d: %s\n", NR, $0)} ' sig.c



第四章 文件编辑和流处理 ----awk

 pattern
字段运算、模式表达式、逻辑表达式
$ ls -l | awk '$5~/.....*/' 列出长度超过 999 字节的文件
$ ls -l | awk '$5 !~ /.....*/' 列出长度小于等于 999 字节的文件
$ ls -l | awk '$5=="4096"' 列出长度为 4096 字节的文件
$ ls -l | awk 'length($5)>3' 列出长度超过 999 字节的文件
$ ls -l | awk '!(length($5)>3) ' 列出长度小于等于 999 字节的文件
 特殊 pattern
awk 'BEGIN{ 初始化动作 }'
awk 'END{ 结束动作 }'
第四章 文件编辑和流处理 ----awk

 变量和运算
举例:打印某个文件的行数、单词数和字符数

$ awk '{

nw += NF;

nc +=length($0)+1;

}

END{

print NR, nw,nc;


}' sig.c
 // 这段程序的功能与 wc 命令的功能完全一样。
第四章 文件编辑和流处理 ----awk

 流程控制
寻找文件中相同的相邻单词

 $ awk 'NF>0{
 if ($1==lastword)
 printf("double %s, line %d:\n%s\n", $1,NR,$0);
 for (i=2; i<=NF; i++)
 if ($i==$(i-1))
 printf("double %s, line %d:\n%s\n", $i,NR,$0);
 lastword=$NF;
 } ' tmp
第四章 文件编辑和流处理 ----awk

 流程控制(二)
while 语句

 while (condition){
 statement1
 statement2
 …
 }

break: 跳出循环

continue: 下一个循环

next: 下一条记录,回到 awk 程序开始


exit: 跳转至 END 模式或结束



第四章 文件编辑和流处理 ----awk

 内部变量(部分)
FILENAME 当前输入文件名

RS
 输入记录的分割符(默认为换行符)
FS
 输入字段的分隔符(默认为空格、制表符)
NF
 当前记录的字段数
NR
 当前记录数
OFS
 输出字段的分隔符(默认为空格)
ORS 输出记录的分隔符(默认为换行)

第四章 文件编辑和流处理 ----awk

 内部函数(部分)
cos(expr) 求余弦

exp(expr) 求自然指数

index(s1,s2)
 是否字符串 s2 位于 s1 中
int(expr)
 取整
length(s)
 求字符串长度
log(expr)
 求自然对数
sin(expr)
 求正玄
split(s, a, c) 按分隔符 c 将 s 放入 a[1],a[2],… 中

substr(s,m,n) 求 s 的子串,从第 m 个字符开始,共 n 个字符。



第四章 文件编辑和流处理 ----awk

 数组
$ awk '{line[NR] = $0}

 END{
 # do what you want
 for (i=1; i<=NR; i++) print line[i]
 }'

 流处理程序的约定,当给定文件名时,数据从文件中读取,否则从
标准输入读取。这样便于管道和重定向的使用。
第四章 文件编辑和流处理 ----awk

 五、 vi 编辑器
 由 BSD UNIX 的作者 Bill Joy 编写
 分两种工作模式:命令模式、编辑模式。 a 、 i 、 o 、 O 命令进入
编辑模式, ESC 退出编辑模式。
 在命令模式下,可使用所有的 ed 命令。

You might also like