22
第第第 第第 UNIX 第第第第 主主主 主主主主主主主主主主 主 :more,cat,sort,grep 主主(1) 主主主主主主主主 主主主主主主主主主主 ,。 (2) 主主主主主主主 主主主主主主主主 , 主主主主主主主主主主主主(3) 主主主主主主主主主主主 主主 : sort sort file1 file2

第二章 基本 UNIX 实用程序

Embed Size (px)

DESCRIPTION

第二章 基本 UNIX 实用程序. 主要是一些文本文件的处理程序 例 :more,cat,sort,grep. 特点: (1) 当不指定文件名时,从标准输入获得数据。 (2) 当指定文件名时,从文件中获取数据 , 而且可以同时指定多个文件。 (3) 处理结果在标准输出显示. 举例 : sort sort file1 file2. 为什么将实用程序设计的具有这些特点 ?. 考虑下列因素 : 标准输入 / 标准输出 shell 的文件通配符 输入输出重定向 管道. more 与 pg: 逐屏显示文件. - PowerPoint PPT Presentation

Citation preview

Page 1: 第二章 基本 UNIX 实用程序

第二章 基本 UNIX 实用程序主要是一些文本文件的处理程序 例 :more,cat,sort,grep

特点: (1) 当不指定文件名时,从标准输入获得数据。 (2) 当指定文件名时,从文件中获取数据 ,

而且可以同时指定多个文件。 (3) 处理结果在标准输出显示举例 : sort sort file1 file2

Page 2: 第二章 基本 UNIX 实用程序

考虑下列因素 : 标准输入 /标准输出 shell 的文件通配符 输入输出重定向 管道

为什么将实用程序设计的具有这些特点 ?

Page 3: 第二章 基本 UNIX 实用程序

more :最先由 BSD UNIX 开发, pg :最先由 AT&T UNIX 开发。使用方法: more server.c 指定一个文件 more *.[ch] 指定多个文件 ls -l | more 指定 0 个文件 pg *.[ch](1) more 显示满屏后 , 屏幕最后行反转显示 --more-- 或 --more--(15%) 。 当显示暂停之后,可以使用下列命令: 空格 -- 下屏 <CR>-- 上滚一行 q--quit/pattern<CR>-- 搜索指定模式的字符串,模式描述使用正则表达式。 /<CR> 继续查找指定模式的字符串 h--help    Ctrl-L--redraw, 屏幕刷新,在 vi 中也使用 Ctrl-L 。

more 与 pg: 逐屏显示文件

Page 4: 第二章 基本 UNIX 实用程序

(2)pg 显示满一屏后 , 屏幕最后一行为冒号 (:) 提示符,显示暂停, 等待按键命令: <CR> -- 下一屏 l<CR> -- 上滚一行 q<CR> -- 退出 h<CR> -- help Ctrl-L<CR> -- redraw, 屏幕刷新 /pattern<CR> 查找指定模式的字符串 , 模式描述用正则表达式规则 / <CR> 继续查找。(3) 两命令比较 more 比 pg 少按键 (pg 要比 more 多按回车键 , 每个命令后面都要加回车后才执行 ) man 命令也使用 more 或 pg 。系统管理员可以设定 man 命令中使用 more 或 pg ,将文件 /etc/default/man 中的 PAGER=/usr/bin/pg 行改为 PAGER=usr/bin/more

more 与 pg: 逐屏显示文件(续 )

Page 5: 第二章 基本 UNIX 实用程序

cat--concatenate: 串结 , 文本格式打印 od--octal dump 八进制打印 hd--hex dump, 十六进制打印 例 :cat tryl.c 命令行参数 :1 个cat tryl.c tryx.c try.h 命令行参数 :3 个cat >try 命令行参数 =0 个 , 从 stdin 获取数据 , 直到 ctrl-dod -x x.dat 以十六进制打印文件 x.dat 各字节hd x.dat | more 以十六进制打印文件 x.dat 各字节echo abcdABCD | hd 十六进制显示 8 个字符的 ASCII 码

cat 与 od , hd :列出文件内容

例 :root[15]#echo abcdABCD | hd0000 61 62 63 64 41 42 43 44 0a abcdABCD.0009root[16]#

Page 6: 第二章 基本 UNIX 实用程序

head -15 ab.c 显示文件 ab.c 中前 15 行head -23 a.c b.c c.c | more 显示三个文件各自的前 23 行共显示 69 行netstat -s -p tcp | head -14tail -10 liu.maills -s | sort | head -10

head与 tail

例 : netstat -p tcp -s | head -7tcp: 342142 packets sent 337859 data packets (327736229 bytes) 8 data packets (9280 bytes) retransmitted 2876 ack-only packets (593 delayed) 23 URG only packets 6 window probe packets

Page 7: 第二章 基本 UNIX 实用程序

可以列出文件中一共有多少行 , 有多少个单词 , 多少字符当指定的文件数大于 1 时 , 最后还列出一个合计 .例: wc sum.c (1 个文件 ) wc x.c makefile stat.sh ( 多个文件 )选项 -l : 只列出行计数wc -l *.c makefile start.shps -ef | wc -l (0 个 )ps -ef | grep liang | wc -l (0 个 )who | wc -l (0 个 )

wc: 字计数 word count

例 : wc *.c 1183 2303 32600 fterm.c 520 984 13802 keys.c 43 71 876 mycat.c 22 38 579 prt.c 1183 2303 32600 tmpfterm.c 1163 2568 24888 vt100.c 4114 8267 105345 total

Page 8: 第二章 基本 UNIX 实用程序

例 : sort telnos>namesorted sort score | head -5 ls -s | sort 将文件按大小排序。

sort: 对文件内容排序

例 : root[23]#ls -s | sort | tail -10 106 prt 116 sz.Z 130 rz.Z 152 vt100test.log 162 mycat 176 a.out 190 vt100 388 fixterm 990 fixterm.tartotal 3144root[24]#

Page 9: 第二章 基本 UNIX 实用程序

将从 stdin 得到的数据在 stdout 显示的同时存入磁盘文件中。例 : ifvl2 -trace3 | tee debug.txt

在实时显示的同时 , 又存盘入文件 debug.txt

myapp | tee myapp.log

tee :三通

Page 10: 第二章 基本 UNIX 实用程序

正则表达式 Regular Expressions 广泛应用于字符串的匹配和替换中 如 :UNIX 命令中的 vi more pg grep egrep yacc lex

其他 :Turbo Pascal/Visual C/Word 等等

正则表达式的概念

正则表达式用于描述一个字符串模式 , 在模式匹配操作中使用。 注意 : 正则表达式规则与文件名匹配规则是不同的。一般来说,正则表达式规则用于文本处理的场合,文件名匹配规则用于文件处理的场合。

Page 11: 第二章 基本 UNIX 实用程序

共 6 个 . * [ \ ^ $

除此之外的其它字符与其自身匹配 用反斜线可以取消特殊字符的特殊含义 ( 转义 ). 如:正则表达 en

d\. 只与字符串 end. 匹配

正则表达式的特殊字符

Page 12: 第二章 基本 UNIX 实用程序

长的 , 复杂的正则表达式是由单字符正则表达式构成的 .

( 1 )非特殊字符与其自身匹配 如 :a 与 a,b 与 b

( 2 )转义字符 (\): 在特殊字符前 , 缀以反斜线 , 则丧失字符的特殊含义,与其自身匹配 \. \* \$ \^ \[ \\

( 3 )圆点 (·) 匹配任意单字符

单字符正则表达式

Page 13: 第二章 基本 UNIX 实用程序

· 在[与]之间的字符为集合的内容, 如:单字符正则表达式[ abcd ]与 a 或 b,c,d 匹配 · 用减号定义一个区间 如 [a-d] [A-Z] [a-zA-Z0-9] 若减号在最后 , 则失去表示区间的意义 , 如 :[ad-] 只与 3 个字符匹配 · 可以用 ^ 表示补集 若 ^ 在开头 , 则表示与集合内字符之外的任意其它单字 符匹配 , 如 :[^a-z] 匹配任一非小写字母。 若 ^ 不在开头 , 则失去其表示补集的特殊意义。 如 :[a-z^] 能匹配 27 个单字符 . 圆点 , 星号,反斜线在方括号内时,代表它们自己 如 :[\*. ]可以匹配 3 个单字符

单字符正则表达式:定义集合

Page 14: 第二章 基本 UNIX 实用程序

( 1 )串结 : 如 abc , [A-Z].[0-9]· ( 2 )星号 (*) :单字符正则表达式后跟 * ,则匹配此单字符正则表达式的 0 次或任意多次出现例 1 : 12*4 1234 不匹配

1224 匹配 2224 匹配 14 匹配

例 2: 正则表达式 [A-Z][0-9]* 此例中 * 作用的单字符正则表式为 [0-9], 代表 [A-Z]

[A-Z][0-9] [A-Z][0-9][0-9] [A-Z][0-9][0-9][0-9] ,等等与 A,A1,C45,D768 匹配,与 b64512,T546t 不匹配

单字符正则表达式的组合

Page 15: 第二章 基本 UNIX 实用程序

(1) $ 只有出现在正则表达式最尾部时才有特殊意义,否则与其自身匹配 例 1: 123$ 则匹配文件中行尾的 123, 不在行尾的 123 字符与正则表达式 123$ 不匹配。 例 2: $123 与字符串 $123 匹配 (2)^ 只有出现在正则表达式最首部时才有特殊意义 , 否则与其自身匹配 例 1: 正则表达式 ^printf 匹配行首的 printf 字符串不在行首的 pri

ntf 串不匹配。 例 2: 正则表达式 Hel^lo 与字符串 Hel^lo 匹配 例 3: 在 vi 中使用 :10,50s/^ //g

删除 10-50 行的每行行首的 4 个空格。

正则表达式: $与 ^

Page 16: 第二章 基本 UNIX 实用程序

grep 在文件中查找字符串grep---- Global regular expression print 语法: grep 模式 文件名列表grep O_RDWR *.hps -ef | grep liangls -l / | grep '^d' | wc -l例: ls -ldrwxr-xr-x 9 root root 512 Jul 11 13:33 apidrwxr-x--- 4 root sys 512 Jul 11 13:33 developdrwxr-xr-x 2 root root 1024 Jul 11 13:33 m3-rw-r--r-- 1 root other 821 Nov 1 1999 makefiledrwxr-xr-x 2 root root 512 Jul 11 13:33 moddrwxr-xr-x 2 root other 512 Jul 11 13:33 sdlcdrwxr-xr-x 3 root other 1024 Jul 26 14:09 tooldrwxr-xr-x 2 root other 512 Jul 11 13:33 tty-rw------- 1 root sys 1838 Sep 27 11:10 vl2_acn.cdrwxr-xr-x 2 root root 512 Jul 11 13:33 vla-rw------- 1 root sys 73506 Sep 27 11:10 vlk.c-rw------- 1 root sys 6873 Sep 27 11:10 vlrd.c

Page 17: 第二章 基本 UNIX 实用程序

egrep 和 fgrepegrep 在描述模式时 , 还可以用 | + () 等 + 两个模式表达式串结 | 多个模式的逻辑或 () 用括号括起的内容表示分组

例 :egrep 'SEEK_.*|O_.|IPC_.*' *.hps -ef | egrep ’[0-9]:[0-9][0-9]+(client|server)’

egrep 在指定模式方面比 grep 更灵活,运行速度也更快,但算法需要存储空间有时会按指数速度上升fgrep( 快速 grep) 按字符串搜索而不是按模式搜索。 fgrep 运算速度快 , 对存储空间要求低,但只能指定字符串,不可按模式查找。

Page 18: 第二章 基本 UNIX 实用程序

grep 选项选项: grep/fgrep/egrep 有若干选项用以控制输出格式 -n 显示时每行前面显示行号 -v 显示所有不包含模式的行 grep -v '[Dd]isable' device.stat > device.active

将文件 device.stat 中取消所有含有指定模式的行 , 生成新文件 d

evice.active

例 :grep '[0-9]*' chapter1

[0-9]* 与空字符串匹配 , 上述命令打印出 chapter1 文件中所有行 grep '[0-9][0-9]*' chaptev1

打印出文件 chapterl 中含有数字的行

Page 19: 第二章 基本 UNIX 实用程序

awk: 文本处理语言a.w.k 分别为该实用程序的三位设计者姓氏的第一个字母。用法 : awk ' 程序 ' 文件名列表 awk -f 程序文件名 文件名列表程序:条件{动作}常用: / 模式 / { 动作 } 模式的描述 , 使用扩展的正则表达式 ( 与 egrep 同 ) 。 每次读取文件的一行 , 如果该行与模式匹配 ( 满足指定条件 ) 则执行相应动作 , 该程序可以做得非常复杂。 awk 本身是一种文本处理语言的解释程序,含有条件判断,循环控制,变量,内部函数,等等。

Page 20: 第二章 基本 UNIX 实用程序

awk 举例root[45]#ps -ef | grep guest guest 669 668 0 11:27:13 ttyp1 00:00:00 -sh guest 678 669 0 11:27:18 ttyp1 00:00:00 viroot[46]#ps -ef | grep guest | awk '{ printf "%s ",$2 }'669 678root[47]# cat test.c | awk '{printf "%d: %s\n",NR,$0 }' 1: main()2: {3: printf("Hello!\n");4: }

$1 为该行的第一列内容, $2 为第 2 列内容,……, $0 为本行整行的内容NR 为当前行号。

Page 21: 第二章 基本 UNIX 实用程序

sed: 流编辑stream editor用法 :sed ' 命令 ' 文件名列表sed -f 命令文件 文件名列表例 : sed '/100\.1\.l\.4/ 计算中心 /g' /etc/host_tab 将 100.1.1.1 替换为” 计算中心”cat /etc/hosts | sed -f sed.cmd其中 sed.cmd 文件

s/100\.l\.l\.4/ 计算中心 /g s/100\.1\.1\.5/ 明光村 /g

Page 22: 第二章 基本 UNIX 实用程序

tr: 翻译字符用法: tr string1 string2

把 stdin 拷贝到 stdout, 对选出的字符作替换。在字符串 string1

中出现的输入字符被替换为字符串 string2 中的对应字符。 例: cat telnos | tr UVX uvx 可以使用[ ]指定一个集合。 例: cat report | tr '[a-z]' '[A-Z]' 将小写字母改为大写字母。 也可以使用 \ 加三个八进制数字(类似 C 语言中描述字符串的方法)表示一个字符。 例: cat file1 | tr % '\012' 将 % 改为换行符(注意不要漏掉必需的单引号)。