《UNIX初级讲座Ch06数据处理工具.ppt》由会员分享,可在线阅读,更多相关《UNIX初级讲座Ch06数据处理工具.ppt(128页珍藏版)》请在三一办公上搜索。
1、UNIX操作系统,北京邮电大学电信工程学院多媒体中心,2023/7/8,2,第六章数据处理工具,高级命令介绍 正则表达式 grep家族 sed awk,2023/7/8,3,6.1 高级命令介绍,2023/7/8,4,cut,名称:cut权限:所有使用者 语法:cut section specifiers options file 说明:cut命令浏览每行输入,将每行分成节,然后显示指定的节。如果不指定输入,则使用STDIN。节描述符,2023/7/8,5,你可以用几种不同的方式来组成LIST参数:使用逗号表示单个不连续的小节:f4,7使用范围表示连续的几个小节:-b2-4使用n-表示从n小节
2、开始直到行结束的所有小节。,2023/7/8,6,选项,2023/7/8,7,范例:Apple$more test1.txt test2alongsentencethis is test1Apple$cut-f2,3-d test1.txt test2alongsentenceis test1Apple$cut-f2-d-s test1.txt isApple$cut-c0-6 test1.txt#print开头算起前6个字元 test2athis i,2023/7/8,8,find,名称:find语法:find path expression说明:find命令检查目录树并计算所遇到的每一个表
3、达式的值。缺省路径是当前路径,缺省表达式是-printfind根据下列规则来分割路径和表达式,在命令行上第一个-(),!之前的部份为路径,之后的是表达式。,2023/7/8,9,表达式分为选项子句、测试子句和动作子句三部分。各个子句之间通过运算符连接,缺省运算符为-and。运算符:,2023/7/8,10,选项影响整个find命令,因此它们总是返回真值。,2023/7/8,11,find命令的测试:,2023/7/8,12,find命令的测试(续):,2023/7/8,13,find命令的测试(续):,2023/7/8,14,find命令的测试(续):,2023/7/8,15,find命令的测
4、试(续):,2023/7/8,16,在上述测试中,出现数字n的地方(时间、大小)可以使用+n表示大于n,-n表示小于n,而n则表示正好等于n。-perm-mode All of the permission bits mode are set for the file.-perm+mode Any of the permission bits mode are set for the file.,2023/7/8,17,find命令的动作:,2023/7/8,18,范例:将当前目录及其子目录下所有扩展名是c的文件列出来。Apple$find.-name“*.c”将目前目录其其下子目录中所有普通
5、文件列出来 Apple$find.-ftype f将目前目录及其子目录下所有最近 20 分钟内更新过的文件列出 Apple$find.-ctime-20,2023/7/8,19,将当前目录及其子目录下所有扩展名不是c的文件列出来:Apple$find.-name“*.c”o print显示目录的深度及文件的目录名和文件名:Apple$find ch1-printf%d%h/%fn0/ch11 ch1/ch1.cpp1 ch1/ch1.h1 ch1/ch1_main.cpp1 ch1/Makefile,2023/7/8,20,显示所有具有全局可执行权限的文件:Apple$find.-type f
6、-perm-001-print./test./filecounter./filesplitor./dtree,2023/7/8,21,使用find命令来生成命令行:Apple$dir2=“backup”Apple$find dir1-type d printf mkdir-p$dir2/%Pn-o!-type d printf mv%p$dir2/%pn|sh%P和%p都是输出文件名,%p的输出是从命令行上指定的搜索目录开始,而%P则去掉命令行上指定的目录,2023/7/8,22,Apple$tree.|-dir2|-one.txt|-two.txt|-one.txt-two.txt,Appl
7、e$find dir1-printf%pndir1dir1/one.txtdir1/two.txtdir1/dir2dir1/dir2/one.txtdir1/dir2/two.txtApple$find dir1-printf%Pn one.txttwo.txtdir2dir2/one.txtdir2/two.txt,2023/7/8,23,info,名称:info语法:info options nodename 说明:info命令启动GNU扩展超文本文档系统。系统中每一个小而精的信息被称为一个节点。,2023/7/8,24,join,名称:join语法:join options file1
8、 file2说明:将两个文件中拥有相同字段的行合并起来。,2023/7/8,25,选项:,2023/7/8,26,选项(续):,2023/7/8,27,jnames001 Barry002 Mario003 John004 Harry005 Dorothy006 Jackie,jhiredt001 04/12/1989002 06/23/1994003 12/12/1997004 11/17/1997005 02/06/1994006 07/20/1995,范例:先建立三个示例文本文件:,jhiredt001 135000002 80000003 45000004 75000005 90000
9、007 68000,2023/7/8,28,Apple$join jnames jsalaries 001 Barry 135000002 Mario 80000003 John 45000004 Harry 75000005 Dorothy 90000,Apple$join-a1 jnames jsalaries 001 Barry 135000002 Mario 80000003 John 45000004 Harry 75000005 Dorothy 90000006 Jackie,2023/7/8,29,Apple$join-a2 jnames jsalaries 001 Barry
10、135000002 Mario 80000003 John 45000004 Harry 75000005 Dorothy 90000007 68000,Apple$join-o1.2,2.2 jnames jsalaries Barry 135000Mario 80000John 45000Harry 75000Dorothy 90000,2023/7/8,30,Apple$join-v1 jnames jsalaries006 JackieApple$join-v2 jnames jsalaries007 68000Apple$join-a1 jnames jsalaries|join-j
11、hiredt 001 Barry 135000 04/12/1989002 Mario 80000 06/23/1994003 John 45000 12/12/1997004 Harry 75000 11/17/1997005 Dorothy 90000 02/06/1994006 Jackie 07/20/1995,2023/7/8,31,nl,名称:nl语法:nl options file说明:加上行号后输出文件,2023/7/8,32,pstree,名称:pstree语法:pstree options pid|user说明:以树形格式输出进程名,缺省时以init进程为根节点,可以通过指
12、定pid或user来改变根节点。,2023/7/8,33,选项:,2023/7/8,34,范例:Apple$pstree-hinit-+-adsl-connect-pppd-pppoe|-atd|-bdflush|-crond|-eth0|-kapmd|-keventd|-khubd|-2*kjournald|-klogd|-ksoftirqd_CPU0|-kswapd|-kupdated,|-lockd|-mdrecoveryd|-3*mingetty|-miniserv.pl|-portmap|-pptpd-3*pptpctrl-pppd-ip-up|-proftpd|-rhnsd|-rp
13、c.statd|-rpciod|-socks5-2*socks5|-sshd-+-sshd-bash-ssh|-sshd-bash-pstree|-syslogd-xinetd,2023/7/8,35,sort,名称:sort语法:sort options file说明:将输入文件按行排序、将多个有序文件合并或验证文件是否是有序的。缺省时sort将单个空格作为字段定界符。然后根据最左边的字段对各行排序,如果最左边的字段相同,则检查下一个字段。当给大文件排序时,应保证有足够的临时磁盘空间。,2023/7/8,36,选项:,2023/7/8,37,选项(续):,2023/7/8,38,范例测试文件
14、date:1 AC BB CC2 AB CC DD3 CA BB CC5 BE DD EE4 BD AA AA,Apple$sort date1 AC BB CC2 AB CC DD3 CA BB CC4 BD AA AA5 BE DD EEApple$sort-k2 date2 AB CC DD1 AC BB CC4 BD AA AA5 BE DD EE3 CA BB CC,2023/7/8,39,Apple$sort-k2.3 date13 CA BB CC2 AB CC DD1 AC BB CC4 BD AA AA5 BE DD EEApple$sort-k2.3r date15 BE
15、DD EE4 BD AA AA1 AC BB CC2 AB CC DD3 CA BB CC,Apple$sort-n date11 AC BB CC2 AB CC DD3 CA BB CC4 BD AA AA5 BE DD EE,2023/7/8,40,split,名称:split语法:split opt input PREFIX说明:split命令以大小作为划分的标准将文件分割成几个部分,分割后的文件名为PREFIXaa、PREFIXab,缺省的前缀为x,缺省的后缀长度为2。,2023/7/8,41,选项:,2023/7/8,42,strings,名称:strings语法:strings o
16、pt file说明:此命令用于显示二进制文件中的可打印字符串。缺省时,strings在文件的初始化小节和已装入小节中寻找所有长度大于4个字符的可打印字符序列。,2023/7/8,43,选项:,2023/7/8,44,tee,名称:tee语法:tee options file说明:T型管道:从STDIN中读取并写到STDOUT和指定的文件中。选项,2023/7/8,45,范例:hopblack hop$ls-l|tee ls.dat|wc-l 14hopblack hop$more ls.dat total 52drwxrwxr-x 2 hop hop 4096 Oct 16 21:43 ch1
17、-rw-rw-r-1 hop hop 55 Nov 1 13:27 date1drwxrwxr-x 3 hop hop 4096 Nov 1 11:33 dir1-rwxrwxr-x 1 hop hop 195 Oct 31 22:56 dtree-rw-rw-r-1 hop hop 935 Oct 3 21:54 ex-01-01-a.cpp-rw-rw-r-1 hop hop 584 Oct 3 21:44 ex-01-01-b.cpp-rwxrwxr-x 1 hop hop 3095 Oct 31 13:30 filecounter-rwxrwxr-x 1 hop hop 1049 Oc
18、t 31 23:03 filesplitor-rw-rw-r-1 hop hop 90 Nov 1 12:15 jhiredt-rw-rw-r-1 hop hop 62 Nov 1 12:14 jnames-rw-rw-r-1 hop hop 61 Nov 1 12:17 jsalaries-rwxrwxr-x 1 hop hop 1654 Oct 31 12:26 test-rw-rw-r-1 hop hop 33 Nov 1 09:38 test1.txt,2023/7/8,46,tr,名称:tr语法:tr options charset1 charset2说明:对从STDIN中读入的字符
19、进行变换、压缩或删除,然后将结果送至STDOUT,charset1和charset2指定了哪些字符被转换以及它们被转换成什么字符。当charset1和charset2都被指定并且没有使用-d选项时,tr执行转换,每一个与charset1中的字符匹配的输入字符都被转换为charset2中相应的字符。tr也可用于将重复出现的字符紧缩为一个字符。,2023/7/8,47,选项:,2023/7/8,48,转换时若charset2比charset1长,则忽略多余的字符;若charset1比charset2长,则不断重复charset2的最后一个字符直到二者一样长。c*n表示字符c重复n次,c*表示将字符
20、c重复必要的次数以使charset1和charset2长度相等。在charset1和charset2中可使用字符类。,2023/7/8,49,范例:数据文件:tr.datABC DEF GHIABC DEF GHIAAA BBB CCC,Apple$tr“A”“Z”tr.datZBC DEF GHIZBC DEF GHIZZZ BBB CCC,2023/7/8,50,Apple$tr ABC Z*tr.datZZZ DEF GHIZZZ DEF GHIZZZ ZZZ ZZZ,Apple$tr ABCD YYZZ tr.dat YYZ ZEF GHIYYZ ZEF GHIYYY YYY ZZZ,
21、2023/7/8,51,Apple$tr-s BC tr.datABC DEF GHIABC DEF GHIAAA B C,Apple$tr-s BC ZZ tr.datAZ DEF GHIAZ DEF GHIAAA Z Z,2023/7/8,52,Apple$tr-d n tr.dat;echoABC DEF GHIABC DEF GHIAAA BBB CCCApple$tr-c A Z tr.datAZZZZZZZZZZZAZZZZZZZZZZZAAAZZZZZZZZZApple$Apple$tr-c A n Z tr.dat AZZ ZZZ ZZZAZZ ZZZ ZZZAAA ZZZ Z
22、ZZ,2023/7/8,53,tty,名称:tty语法:tty OPTIONS说明:输出连接到STDIN的终端的文件名。选项:-s不产生任何输出,只返回一个退出值。范例:Apple$tty/dev/pts/2,2023/7/8,54,uniq,名称:uniq语法:uniq OPTIONS INPUT OUTPUT说明:从已排序的文件中删除重复的行。,2023/7/8,55,选项:,2023/7/8,56,范例:示范文件:uniq.dat01 12345 6789002 12345 6789003 12345 2222203 12345 2222204 11111 22222,Apple$uni
23、q uniq.dat01 12345 6789002 12345 6789003 12345 2222204 11111 22222,2023/7/8,57,Apple$uniq-d uniq.dat03 12345 22222Apple$uniq-u uniq.dat01 12345 6789002 12345 6789004 11111 22222,Apple$uniq-f1 uniq.dat01 12345 6789003 12345 2222204 11111 22222Apple$uniq-f1-w5 uniq.dat01 12345 6789004 11111 22222,2023
24、/7/8,58,xargs,名称:xargs语法:xargs-0prtx-eeof-str-ireplace-str-lmax-lines-n max-args-s max-chars-P max-procs-null-verbose-exit-max-procs=max-procs-version-help command initial-arguments,2023/7/8,59,说明:建立并执行命令行。xargs从STDIN读入被空格和新行符分隔的参数,然后以initial-arguments后跟随读入的参数来执行给定的命令(缺省时执行/bin/echo),2023/7/8,60,选项:
25、,2023/7/8,61,选项(续):,2023/7/8,62,选项(续):,2023/7/8,63,6.2 正则表达式,一、正则表达式语法(Regular Expression)x?0或1个x字符 x*0或0个以上x字符.*0或0个以上任意字符 x+1或1个以上x字符.+1或1个以上任意字符mm个字符m,nm个以上、n个以下个数的字符,2023/7/8,64,m,m个以上个数的字符 范围(若减号在最后,则失去表示区间的意义)范围的补集,若不在开头,则失去其表示补集的特殊意义 字符串开头的字符$字符串末尾的字符 d等价于0-9 d+等价于0-9+D等价于0-9,2023/7/8,65,D+等价
26、于0-9+w等价于a-zA-Z0-9 w+等价于a-zA-Z0-9+W等价于a-zA-Z0-9 W+等价于a-zA-Z0-9+s等价于ntrf s+等价于ntrf+S等价于ntrf,2023/7/8,66,S+等价于ntrf+b寻找不以数字和字母为边界的串 B寻找以数字和字母为边界的串 a|b|c含有a或b或c的串 abc含有abc的串(pattern)依次将找到的串存入$1,$2/pattern/i不考虑大小写 转义,2023/7/8,67,非特殊字符与其自身匹配。在特殊字符前,缀以反斜线,则丧失字符的特殊含义,与其自身匹配。圆点、星号、反斜线在方括号内时,代表它们自己。$只有出现在正则表达
27、式最尾部时才有特殊意义,否则与其自身匹配;只有出现在正则表达式最首部时才有特殊意义,否则与其自身匹配。,2023/7/8,68,二、正则表达式运算符=:$string=/pattern/表示对字符串$string用模式/pattern/进行运算!:不相匹配运算符单目运算符*、+和?优先级最高,其次是串接符,最后是|。所有运算都是左结合的。三、常用的函数 trtr/srchlist/repllist/,把 srchlist转换为repllist ss/PATTERN/REPLACE/eg,用REPLACE替换PATTERN,2023/7/8,69,四、标记正则表达式标记正则表达式是用(和)括起来
28、的部分。匹配时从左到右扫描并依次将匹配的结果存入19号寄存器中,可以使用n引用寄存器的内容。例:(a-z)(a-z)0-921,这个标记正则表达式将匹配所有由5个字符组成、并且中间一位是数字的回文字符串。,2023/7/8,70,示例:if/d/warn has nondigits;unless/d+$/warn not a natural number;#rejects-3unless/-?d+$/warn not an integer;#rejects+3unless/+-?d+$/warn not an integer“;,2023/7/8,71,unless/-?d+.?d*$/war
29、n“not a decimal number”;#rejects.2unless/-?(?:d+(?:.d*)?|.d+)$/;warn“not a decimal number”;unless/(+-?)(?=d|.d)d*(.d*)?(Ee(+-?d+)?$/;warn not a C float“;,2023/7/8,72,6.3 grep家族,grep命令可以在一个文件中搜索指定的字符串。其基本语法为:grep options-e pattern filenamesfilenames是一系列用空格格开的文件名,输出结果时会在每个匹配之前显示文件名如果没有filenames参数,则gre
30、p命令将扫描标准输入缺省情况下grep将输出匹配指定模式的每一行,2023/7/8,73,在pattern中如果含有元字符的话必须将其转义,使用或或“fgrep命令是grep的一个简化版本,仅用于查找固定的字符串而不允许使用正则表达式。其优点为速度快,且可以指定任意个数的查找字符串。,2023/7/8,74,egrep命令具有fgrep的一些特征,同时也能使用正则表达式、增加了一些查找技巧,但是不支持grep和ed命令中的标记表达式(Tag Expression)。以下是grep家族选项总结:仅适用于fgrep:x严格匹配整行,2023/7/8,75,仅适用于grep s隐藏错误信息 w仅匹配
31、整个字仅适用于egrep和fgrep f匹配指定文件中的字符串适用于grep,fgrep和egrep h隐藏文件名的显示,2023/7/8,76,b显示匹配行的磁盘块号 l仅显示发现匹配的文件名 c统计和显示匹配的数量 n显示每个匹配行的行号 v显示非匹配的行 I忽略大小写 e匹配后面的以“-”开头的表达式,2023/7/8,77,grep家族的表达式总结:仅适用于grep和egrep:m转义元字符m行首$行尾.任意单个字符xy$zx,y,$,z中的任意一个字符xy$z上式的否定,2023/7/8,78,a-z指定的范围内的任一字符a-z上式的否定 r*零或多个r表达式 r1r2匹配r1和后续
32、的r2(连接)仅适用于grep:(r)匹配标记正则表达式n设置为匹配第n个标记表达式(19),2023/7/8,79,仅适用于egrep:r+匹配一个或多个r r?匹配零个或一个r r1|r2匹配r1或r2(r1|r2)r3匹配r1r3或r2r3(r1|r2)*匹配零个或多个r1|r2,2023/7/8,80,示例:Apple$cat myfileblueflybird is me.BLUEFLYBIRD IS ME.Yes,Im blueflybird.of course,Blueflybird is me.Of Course,BLUEFLYBIRD IS ME.BLUEBLUE BLUE
33、by BLUE blue bird bird,2023/7/8,81,分支、块、原子Apple$egrep blueflybird|BLUEFLYBIRD.*E.$myfile blueflybird is me.BLUEFLYBIRD IS ME.Of Course,BLUEFLYBIRD IS ME.上面的命令包括两个分支,用|分开,意思是查找myfile文件中,以小写blueflybird开头的行,或者是含有大写BLUEFLYBIRD单词并且以E.结尾的行。,2023/7/8,82,匹配行末$如果要查找myfile文件中以e.结尾的行(注意加了转义符):Apple$egrep e.$my
34、fileblueflybird is me.of course,Blueflybird is me.或者匹配以bird.结尾的行(注意$号放在命令后面):Apple$egrep bird.$myfileYes,Im blueflybird.,2023/7/8,83,匹配行首如果要查找myfile文件中以小写b开头的行:Apple$egrep b myfileblueflybird is me.如想查找以小写b或者大写B开始的行:Apple$egrep bB myfileblueflybird is me.BLUEFLYBIRD IS ME.,2023/7/8,84,匹配任一字符.通常与其他me
35、ta字符联合使用,因为.代表任一字符,如下面的命令表示查找以任一字符开头,第二个字符是 f 的行:Apple$egrep.f myfileof course,Blueflybird is me.Of Course,BLUEFLYBIRD IS ME.,2023/7/8,85,匹配内列出的字符查找包括有小写o与大写O的行:Apple$egrep oOf myfileof course,Blueflybird is me.Of Course,BLUEFLYBIRD IS ME.查找不包括小写o与大写O的行Apple$egrep oOf myfileblueflybird is me.Yes,Im
36、blueflybird.of course,Blueflybird is me.,2023/7/8,86,查找包括符号和大写Y的行Apple$egrep Y myfileBLUEFLYBIRD IS ME.Yes,Im blueflybird.Of Course,BLUEFLYBIRD IS ME.BLUEBLUE BLUE by BLUE blue bird bird 查找所有以大写字母开始的行Apple$egrep A-Z myfileBLUEFLYBIRD IS ME.Yes,Im blueflybird.Of Course,BLUEFLYBIRD IS ME.,2023/7/8,87,
37、这里的完整单词并不是说真实的英语单词,而是指连续的字母组合中不含有数字、空格、换行符及制表符,如myfile1中完整单词是myfile 同样my name1eye中,my、name、eye各自是完整单词,而bbeekks无序的组合也是完整单词,2023/7/8,88,匹配次数、+、?、*为了继续说明匹配次数、+、?、*,我们新建一个文件叫myfile1,内容如下:Apple$cat myfile1blueblueblueblueblueblueBLUEBLUEBLUEBLUEBLUEBLUEBLUEBBLLUUEEBLUEEE,2023/7/8,89,如果我要查找两个(精确的两个)连续BLUE
38、相连的行Apple$egrep(BLUE)2 myfile1BLUEBLUEBLUEBLUEBLUEBLUE注意:为了查找BLUEBLUE,用RE表示则是(BLUE)2,而不是BLUE2,如果是BLUE2,则表示BLUEE。,2023/7/8,90,警告:本来要查BLUEBLUE,为甚麽上面还列出了三个连续的BLUE呢?因为BLUEBLUEBLUE包括了BLUEBLUE。如果想查找BLUEBLUE那一行,则必须使用定位符,如:Apple$egrep(BLUE)2 myfile1BLUEBLUE上面的例子查找以两个连续BLUE开始的完整单词的行,2023/7/8,91,如要查找以两个或者两个以上
39、连续BLUE开始的完整单词,则在2后面加上逗号2:Apple$egrep(BLUE)2,myfile1BLUEBLUEBLUEBLUEBLUEBLUE如查找以一至三个连续BLUE开始的完整单词的行:Apple$egrep(BLUE)1,3 myfile1BLUEBLUEBLUEBLUEBLUEBLUEBLUEBLUEEE,2023/7/8,92,如果要查找以至少1个或多个BLUE开始的完整单词行:Apple$egrep(BLUE)+myfile1BLUEBLUEBLUEBLUEBLUEBLUEBLUE如果要查找以0个或多个BLUE开始的完整单词行:Apple$egrep(BLUE)*myfil
40、e1BLUEBLUEBLUEBLUEBLUEBLUEBLUE,2023/7/8,93,如果要查找0个或1个以BLUE开始的完整单词行:Apple$egrep(BLUE)?myfile1BLUE非常值得注意的是:上面的命令(BLUE)?中增加了是否完整单词的测试,如果去掉,那麽:,Apple$egrep(BLUE)?myfile1blueblueblueblueblueblueBLUEBLUEBLUEBLUEBLUEBLUEBLUEBBLLUUEEBLUEEE,2023/7/8,94,由于(BLUE)?表示以0个或1个BLUE开始的行,没有测试BLUE是否完整单词,所以可以匹配任何行,而加了完整
41、单词测试的命令,只能匹配有1个BLUE开始并是完整单词的行匹配。,2023/7/8,95,6.4 sed流编辑器,流是具有特殊属性的动态序列元素。流中所有的元素都具有相同的数据类型。流中元素的个数被称为流的长度。对流可以进行读写操作。sed的基本语法为:sed-n-e edit_cmds in_file或:sed-n f edit_script in_file,2023/7/8,96,其中in_file表示要被编辑的输入流,缺省时是指标准输入-n选项表示隐藏所有输出-e选项指明后续的是一个编辑命令,编辑命令的语法为:addr1,addr2function argsaddr指明操作的行范围,fu
42、nction是命令,args是命令的参数,2023/7/8,97,6.5 awk,awk是一种编程语言,她是由AT&T贝尔实验室的Alfred Aho,Peter Weinberger和Brian Kernighan开发的,Brian Kernighan目前仍在维护及增强awk。awk能非常方便地处理与数据加工和信息检索相关的任务。awk还可以和Shell程序相互结合,从而增强自己的功能。,2023/7/8,98,一、awk基础,一个awk程序是由一系列的“模式动作”语句构成的:pattern actionpattern actionpattern actionawk程序为每个输入行依次地进行
43、每一个模式的匹配寻找,对每一个匹配上的模式执行相应的动作,接着读取下一行并再次开始匹配,直到所有的输入都处理完毕。在一条语句中可以省略模式或者动作,缺省的模式为匹配所有行,缺省的动作为输出当前行:print$0,2023/7/8,99,正是因为模式和动作可有可无,动作才要被花括号括起来以便与模式相区别。awk的程序可以以两种方法来运行:直接命令行方式:awk pattern-action statements input_file_list 其中“模式动作”语句必须括在单引号中。awk命令程序方式 通常将awk程序放在一个单独的文本文件中,然后用-f选项来引用:awk f awk_file i
44、nput_file_list,2023/7/8,100,awk从输入中一次读取一行(一条记录),缺省的RS为n。然后awk将记录分割为一个个的字段,缺省的FS为Blank。一行中的第一个字段称为$1,第二个字段称为$2,整个记录称为$0。awk提供了print和printf语句用于显示输出。print为无格式输出语句:print expr1,expr2,exprN print语句显示每个表达式的串值,默认的ORS和OFS分别为n和Blank。,2023/7/8,101,printf为格式化输出语句:printf format,expr1,expr2,exprN format含有要显示的信息以及
45、要转换的规格说明,其语法与C语言中的输出函数中的格式说明类似。常用的转换字符如下表所示:%c单个字符%d十进制数%e-d.ddddddE+|-dd%f-d.dddddd%ge或f中较短的,并去掉无用的0%o无符号八进制数,2023/7/8,102,%s串%x无符号十六进制数%显示一个%使用printf时,不会自动输出ORS,必须自己在format中使用n来显式地产生。,2023/7/8,103,二、变量,awk的变量分为内部变量和用户定义的变量两种。awk的内部变量有:ARGC命令行参数的个数ARGCIND当前命令行参数下标ARGV命令行参数数组ENVIRON环境变量数组FILENAME当前输
46、入文件名FNR当前文件中的记录号FS字段分隔符IGNORECASE忽略正则表达式和串的大小写,2023/7/8,104,NF当前记录中的字段数NR至今读取的记录数OFMT 数的输出格式,缺省为“%.6g”OFS输出字段分隔符ORS输出记录分隔符RS输入记录分隔符RSTART由match()匹配的第一个字符的索引RLENGTH由match()匹配的串的长度SUBSEP下标分隔符,缺省为“034”当前记录的字段可以用$1,$2,$NF来表示。用户定义的变量类似于Shell中的情形。,2023/7/8,105,三、模式,模式是一种表达式。BEGIN和END是两个特殊的模式,BEGIN在第一条记录被读
47、取之前匹配,END在最后一条记录处理完之后匹配。关系表达式:awk有6个关系运算符和2个正则表达式匹配运算符:小于=小于等于=等于!=不等于,2023/7/8,106,=大于等于大于匹配!不匹配在比较表达式中,若两个操作数都是数值,则进行数值比较,否则进行串比较。类型强制转换:num”,string+0正则表达式:awk把在“”和“!”右边的任一串或变量都解释为一个正则表达式。,2023/7/8,107,当用引号括起来的字面字符串用作一个正则表达式时,如果字符串中含有元字符,需要再加一层反斜线,以保护正则表达式中的元字符。awk里引入了一个新的概念:字符类。这个概念来自于POSIX标准。字符类
48、是一种特殊的表达式,用于描述具有某种特定属性的字符集合。她具体能表示什么样的字符集合是和应用程序的地区特性有关的。,2023/7/8,108,字符类只能在正则表达式中的一对方括号中出现,用于表示特定的字符集合。常用的字符类有::alnum:字母或数字字符:alpha:字母字符:blank:空格或制表符:cntrl:控制字符:digit:数字字符:graph:既能看见又能打印的字符,2023/7/8,109,:lower:小写字母字符:print:可打印字符(非控制字符):punct:标点符号字符:space:空白字符,包括空格、制表、换页等:upper:大写字符:xdigit:十六进制数字字符
49、,2023/7/8,110,模式组合:用圆括号和逻辑运算符|、&和!可以把简单的模式组合成复合模式。优先级从左到右依次增高。模式范围由逗号分隔的两个模式组成:pattern1,pattern2 action表示对于在pattern1和pattern2出现之间的每一条记录都要执行动作。包括pattern1和pattern2。,2023/7/8,111,四、动作,动作决定对模式选中的记录进行什么操作。awk的运算包括算数运算和串运算。awk可以使用传统的算数表达式来计算数值,算数运算在内部以浮点形式完成。常用的算数运算符有:+、-、*、/、+、-、%、+=、-=、*=、/=、%=、=和=,其含义和
50、C语言里一样。awk还提供了一些内部算数函数:atan1(y,x)、cos(x)、exp(x)、int(x)、log(x)、rand()、sin(x)、sqrt(x)和srand(x)其中x、y是任意表达式。Rand()返回(0,1)范围内的随机数,srand(x)用于设置rand()的种子。,2023/7/8,112,awk提供的串运算符只有一个:space,进行串的串接。awk提供的串函数有:gsub(r,s)将当前记录中的r替换为s,全局,返回替换数gsib(r,s,t)在串t中全局用s替换r,返回替换数index(s,t)返回s中串t的位置,不出现时为0length(s)返回串s的长度