220 likes | 318 Views
第二章 基本 UNIX 实用程序. 主要是一些文本文件的处理程序 例 :more,cat,sort,grep. 特点: (1) 当不指定文件名时,从标准输入获得数据。 (2) 当指定文件名时,从文件中获取数据 , 而且可以同时指定多个文件。 (3) 处理结果在标准输出显示. 举例 : sort sort file1 file2. 为什么将实用程序设计的具有这些特点 ?. 考虑下列因素 : 标准输入 / 标准输出 shell 的文件通配符 输入输出重定向 管道. more 与 pg: 逐屏显示文件.
E N D
第二章 基本UNIX实用程序 主要是一些文本文件的处理程序 例:more,cat,sort,grep 特点: (1)当不指定文件名时,从标准输入获得数据。 (2)当指定文件名时,从文件中获取数据, 而且可以同时指定多个文件。 (3)处理结果在标准输出显示 举例: sort sort file1 file2
为什么将实用程序设计的具有这些特点? 考虑下列因素: 标准输入/标准输出 shell的文件通配符 输入输出重定向 管道
more与pg:逐屏显示文件 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:逐屏显示文件(续) (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
cat与od,hd:列出文件内容 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-d od -x x.dat 以十六进制打印文件x.dat各字节 hd x.dat | more 以十六进制打印文件x.dat各字节 echo abcdABCD | hd 十六进制显示8个字符的ASCII码 例: root[15]#echo abcdABCD | hd 0000 61 62 63 64 41 42 43 44 0a abcdABCD. 0009 root[16]#
head与tail head -15 ab.c 显示文件ab.c中前15行 head -23 a.c b.c c.c | more 显示三个文件各自的前23行共显示69行 netstat -s -p tcp | head -14 tail -10 liu.mail ls -s | sort | head -10 例: netstat -p tcp -s | head -7 tcp: 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
wc: 字计数word count 可以列出文件中一共有多少行,有多少个单词,多少字符 当指定的文件数大于1时,最后还列出一个合计. 例:wc sum.c (1个文件) wc x.c makefile stat.sh (多个文件) 选项-l:只列出行计数 wc -l *.c makefile start.sh ps -ef | wc -l (0个) ps -ef | grep liang | wc -l (0个) who | wc -l (0个) 例: 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
sort: 对文件内容排序 例: sort telnos>namesorted sort score | head -5 ls -s | 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.tar total 3144 root[24]#
tee:三通 将从stdin得到的数据在stdout显示的同时存入磁盘文件中。 例: ifvl2 -trace3 | tee debug.txt 在实时显示的同时,又存盘入文件debug.txt myapp | tee myapp.log
正则表达式的概念 正则表达式Regular Expressions广泛应用于字符串的匹配和替换中 如:UNIX命令中的vi more pg grep egrep yacc lex 其他:Turbo Pascal/Visual C/Word 等等 正则表达式用于描述一个字符串模式,在模式匹配操作中使用。 注意:正则表达式规则与文件名匹配规则是不同的。一般来说,正则表达式规则用于文本处理的场合,文件名匹配规则用于文件处理的场合。
正则表达式的特殊字符 共6个 . * [ \ ^ $ 除此之外的其它字符与其自身匹配 用反斜线可以取消特殊字符的特殊含义(转义).如:正则表达end\.只与字符串end.匹配
单字符正则表达式 长的,复杂的正则表达式是由单字符正则表达式构成的. (1)非特殊字符与其自身匹配 如:a与a,b与b (2)转义字符(\):在特殊字符前,缀以反斜线,则丧失字符的特殊含义,与其自身匹配 \. \* \$ \^ \[ \\ (3)圆点(·)匹配任意单字符
单字符正则表达式:定义集合 ·在[与]之间的字符为集合的内容, 如:单字符正则表达式[abcd]与a或b,c,d匹配 ·用减号定义一个区间 如[a-d] [A-Z] [a-zA-Z0-9] 若减号在最后,则失去表示区间的意义, 如:[ad-]只与3个字符匹配 ·可以用^表示补集 若^在开头,则表示与集合内字符之外的任意其它单字 符匹配,如:[^a-z]匹配任一非小写字母。 若^不在开头,则失去其表示补集的特殊意义。 如:[a-z^]能匹配27个单字符 . 圆点,星号,反斜线在方括号内时,代表它们自己 如:[\*.]可以匹配3个单字符
单字符正则表达式的组合 • (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不匹配
正则表达式:$与^ (1) $只有出现在正则表达式最尾部时才有特殊意义,否则与其自身匹配 例1: 123$ 则匹配文件中行尾的123,不在行尾的123字符与正则表达式123$不匹配。 例2: $123与字符串$123匹配 (2)^只有出现在正则表达式最首部时才有特殊意义,否则与其自身匹配 例1:正则表达式^printf匹配行首的printf字符串不在行首的printf串不匹配。 例2:正则表达式Hel^lo与字符串Hel^lo匹配 例3:在vi中使用:10,50s/^//g 删除10-50行的每行行首的4个空格。
grep在文件中查找字符串 grep---- Global regular expression print 语法:grep 模式文件名列表 grep O_RDWR *.h ps -ef | grep liang ls -l / | grep '^d' | wc -l 例:ls -l drwxr-xr-x 9 root root 512 Jul 11 13:33 api drwxr-x--- 4 root sys 512 Jul 11 13:33 develop drwxr-xr-x 2 root root 1024 Jul 11 13:33 m3 -rw-r--r-- 1 root other 821 Nov 1 1999 makefile drwxr-xr-x 2 root root 512 Jul 11 13:33 mod drwxr-xr-x 2 root other 512 Jul 11 13:33 sdlc drwxr-xr-x 3 root other 1024 Jul 26 14:09 tool drwxr-xr-x 2 root other 512 Jul 11 13:33 tty -rw------- 1 root sys 1838 Sep 27 11:10 vl2_acn.c drwxr-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
egrep和fgrep • egrep • 在描述模式时,还可以用 | + () 等 • + 两个模式表达式串结 • | 多个模式的逻辑或 • () 用括号括起的内容表示分组 • 例:egrep 'SEEK_.*|O_.|IPC_.*' *.h • ps -ef | egrep ’[0-9]:[0-9][0-9]+(client|server)’ • egrep在指定模式方面比grep更灵活,运行速度也更快,但算法需要存储空间有时会按指数速度上升 • fgrep(快速grep) • 按字符串搜索而不是按模式搜索。 • fgrep运算速度快,对存储空间要求低,但只能指定字符串,不可按模式查找。
grep选项 选项:grep/fgrep/egrep有若干选项用以控制输出格式 -n 显示时每行前面显示行号 -v 显示所有不包含模式的行 grep -v '[Dd]isable' device.stat > device.active 将文件device.stat中取消所有含有指定模式的行,生成新文件device.active 例:grep '[0-9]*' chapter1 [0-9]*与空字符串匹配,上述命令打印出chapter1文件中所有行 grep '[0-9][0-9]*' chaptev1 打印出文件chapterl中含有数字的行
awk:文本处理语言 a.w.k分别为该实用程序的三位设计者姓氏的第一个字母。 用法: awk '程序' 文件名列表 awk -f 程序文件名文件名列表 程序:条件{动作} 常用:/模式/ {动作} 模式的描述,使用扩展的正则表达式(与egrep同)。 每次读取文件的一行,如果该行与模式匹配(满足指定条件)则执行相应动作,该程序可以做得非常复杂。 awk本身是一种文本处理语言的解释程序,含有条件判断,循环控制,变量,内部函数,等等。
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 vi root[46]#ps -ef | grep guest | awk '{ printf "%s ",$2 }' 669 678 root[47]# cat test.c | awk '{printf "%d: %s\n",NR,$0 }' 1: main() 2: { 3: printf("Hello!\n"); 4: } $1为该行的第一列内容,$2为第2列内容,……,$0为本行整行的内容 NR为当前行号。
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
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' 将%改为换行符(注意不要漏掉必需的单引号)。