Professional Documents
Culture Documents
文件编辑和流处理
第四章 文件编辑和流处理 ----ed
一、 ed 行编辑器
1970 年由 Ken Thompson 编写
优点: 1 )运行环境要求底,是 UNIX 系统最基本的编辑器; 2 )
编辑命令功能强大,至今仍然使用; 3 ) ed 提供的正则表达式广泛
使用; 4 )运行速度很快。
1.1 基本命令
a 从当前行开始添加
. 结束添加状态
// 必须在行首输入
w 存盘
q 退出 ed 编辑器
第四章 文件编辑和流处理 ----ed
. 代表当前行, $ 代表最后一行
1.4 查找
/ 模式 / 查找下一个匹配模式的行,遇到尾行则从首行开始
? 模式 ? 查找上一个匹配模式的行,遇到首行则从尾行开始
第四章 文件编辑和流处理 ----ed
// 重复查找下一个匹配模式的行,模式不变
?? 重复查找上一个匹配模式的行,模式不变
查找会改变当前行
查找返回的是行号,可使用。
1,/main/p
显示 1 到第一次出现 main 的行
/main/-1,$p
显示第一次出现 main 的行的上一行到最后一行
5,?int?d
删除 5 到最后一次出现 int 的行
1.5 插入、删除、撤销
na 从 n 行后添加
m,nd 删除 m 至 n 行
u 撤销所做的编辑
第四章 文件编辑和流处理 ----ed
1.6 替换
s/old/new/ 把当前行中第一个 old 替换为 new
速记符 &
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/ 的行
第四章 文件编辑和流处理 ----ed
/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
三、过滤器
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/.* //' 列出当前子目录名
3.2 sort---- 排序
$ ls | sort
四、模式匹配与处理语言 awk
一般使用形式:
$ awk 'program' filename
program 的形式
pattern: ed 的正则表达式,逻辑表达式
缺省
$ awk '/pattern/' file 显示匹配模式的每一行,功能同 grep
记录、字段
每一行为一条记录, NR 为记录数
, NF 为字段数
$ awk '{print NR, $0}' file 显示 file ,并在行首加上行号
打印(显示)
$ ls -l | awk '{print NR, ": " $1, $8}'
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{
}' 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: 下一个循环
内部变量(部分)
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],… 中
数组
$ 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 命令。