《Unix & Linux 大学教程 第19章 过滤器:选取、排序、组合及变换》由会员分享,可在线阅读,更多相关《Unix & Linux 大学教程 第19章 过滤器:选取、排序、组合及变换(74页珍藏版)》请在金锄头文库上搜索。
1、Unix & Linux 大学教程大学教程第第19章章 过滤器:选取、过滤器:选取、排序、组合及变换排序、组合及变换本章需要解决的几个问题本章需要解决的几个问题lgrep有什么作用?为什么它在管道线中特别有有什么作用?为什么它在管道线中特别有用?用?lsort程序可以执行的两项任务是什么?程序可以执行的两项任务是什么?l什么是排序序列?什么是区域设置?是什么将什么是排序序列?什么是区域设置?是什么将它们连接在一起的?它们连接在一起的?luniq程序可以执行哪程序可以执行哪4项任务?项任务?ltr程序可以执行哪程序可以执行哪3项任务?项任务?本章主要内容本章主要内容lgrep命令(命令(19.1
2、19.3)llook命令(命令(19.419.6)lsort命令(命令(19.719.11)luniq命令(命令(19.12)ljoin命令(命令(19.13)ltshort命令(命令(19.14)lstrings命令(命令(19.15)ltr命令(命令(19.1619.18)lsed命令(命令(19.1919.22)1. grep命令命令grep简介简介l读音:读音: grepl全称:全称:Globally search given Regular Expression and Print l功能:功能: 选取包含特定模式的行选取包含特定模式的行19.1 选取包含特定模式的行:选取包含特定模
3、式的行:grepl语法定义:语法定义:grep -cilLnrsvwx pattern file其中:其中: pattern:要搜索的模式:要搜索的模式19.1 选取包含特定模式的行:选取包含特定模式的行:grepl例子:例子:$ grep harley /etc/passwd $ grep : info $ w -h | grep pm | cut -c 1-819.2 最重要的最重要的grep选项选项l-c:选择所选择行的数量:选择所选择行的数量l-i:模式匹配时忽略大小写的区别:模式匹配时忽略大小写的区别l-n:在输出的每一行前写一个相对行号:在输出的每一行前写一个相对行号l-l:从多个
4、文件中搜索指定模式时,:从多个文件中搜索指定模式时,不输出不输出包含该包含该模式的行,模式的行,而输出而输出包含该模式的文件名包含该模式的文件名l-L:从多个文件中搜索指定模式时,:从多个文件中搜索指定模式时,输出不包含输出不包含该模式的文件名该模式的文件名 19.2 最重要的最重要的grep选项选项l-w:全字匹配:全字匹配l-v:选择不包含指定模式的所有行选择不包含指定模式的所有行l-x:查找完全由搜索模式构成的行:查找完全由搜索模式构成的行l-r:搜索整个目录树:搜索整个目录树l-s:不显示不存在或无匹配文本的错误信息:不显示不存在或无匹配文本的错误信息19.2 最重要的最重要的grep
5、选项选项l-c:countl-i:ignore-casel-n:line-numberl-l:files-with-matchesl-L:files-without-matchl-w:word-regexpl-v:revert-matchl-x:line-regexpl-r:recursivel-s:silent 19.3 grep的变体:的变体:fgrep、egrepl简化版简化版grep:fgrep(fixed grep) - 只能搜索固定字符串,不能使用正则表达式只能搜索固定字符串,不能使用正则表达式l加强版加强版grep:egrep(extended grep) - 支持扩展正则表达式
6、支持扩展正则表达式2. look命令命令look简介简介l功能:功能: (1) 选取特定模式开头的行;选取特定模式开头的行; (2) 查找特定模式开头的单词。查找特定模式开头的单词。19.4 选取特定模式开头的行:选取特定模式开头的行:lookl语法定义:语法定义:look -df pattern file其中:其中: pattern:要搜索的模式:要搜索的模式 file:要搜索的文件:要搜索的文件 -d: 只对比英文字母和数字,其余忽略只对比英文字母和数字,其余忽略 -f: 忽略字符大小写差别忽略字符大小写差别19.5 使用使用look和和grep的时机的时机llook的的3个缺点:个缺点:
7、 - 1. 要求有输入;要求有输入; - 2. 只能从文件中读取数据,不能从标准输只能从文件中读取数据,不能从标准输入中读取数据;入中读取数据; - 3. 只能在行的开头搜索指定的模式。只能在行的开头搜索指定的模式。llook的的2个优点:个优点: - 1. 易于使用;易于使用; - 2. 搜索速度快。搜索速度快。19.5 使用使用look和和grep的时机的时机lgrep的的2个缺点:个缺点: - 1. 使用复杂;使用复杂; - 2. 速度比速度比look慢。慢。lgrep的的2个优点:个优点: - 1. grep是过滤器(管道是过滤器(管道-过滤器模式);过滤器模式); - 2. 搜索灵活
8、,功能强大。搜索灵活,功能强大。19.6 查找特定模式开头的单词:查找特定模式开头的单词:lookl语法定义:语法定义:look pattern其中:其中: pattern:要搜索的模式:要搜索的模式 说明:说明: 查找的目标是字典文件查找的目标是字典文件 words is a standard file on all Unix and Unix-like operating systems, and is simply a newline-delimited list of dictionary words. It is used, for instance, by spell-checki
9、ng programs. The words file is usually stored in /usr/share/dict/words, or /usr/dict/words. A words file is also used to contain words related to a specific topic. 3. sort命令命令sort简介简介l功能:功能: (1) 数据排序;数据排序; (2) 检查数据是否有序。检查数据是否有序。19.7 排序数据:排序数据:sortl语法定义:语法定义:sort -dfnru -o outfile infile其中:其中: outfil
10、e:输出文件的名称:输出文件的名称 infile:输入文件名称:输入文件名称 说明:说明: 可以按行排序,也可以按字段排序可以按行排序,也可以按字段排序 19.7 排序数据:排序数据:sortl例子:例子: $ sort -o names names $ sort name1 name2 name 特别注意特别注意-o和重定向的用法。和重定向的用法。19.8 控制数据排序的顺序:控制数据排序的顺序:sort -dfnl控制控制sort工作方式的选项:工作方式的选项: -d:dictionary-order,只按字母、数字和,只按字母、数字和空白符排序,忽略其他字符空白符排序,忽略其他字符 -f
11、:ignore-case,忽略大小写,忽略大小写 -n:numeric-order,识别行开头或字段开,识别行开头或字段开头的数字,并按数字进行排序头的数字,并按数字进行排序 -r:reverse,反向排序,反向排序 -u:unique,相同的行只留一个,相同的行只留一个19.9 检查数据是否有序:检查数据是否有序:sort -cl语法定义:语法定义:sort -cu file其中:其中: -c:check,不排序,只检查数据是否,不排序,只检查数据是否有序。如果输入文件排序不正确,就返回有序。如果输入文件排序不正确,就返回一个非零值。一个非零值。 -cu:check & unique 不仅检
12、查数据是不仅检查数据是否有序,同时也检查数据行是否唯一。否有序,同时也检查数据行是否唯一。19.10 ASCII码;排序序列码;排序序列lASCII码:美国信息交换标准码码:美国信息交换标准码 - 使用使用7位来记录一个字符,从位来记录一个字符,从0000000到到1111111,共,共128个字符。个字符。 - 包括包括33个控制字符、个控制字符、95个可显示字符(个可显示字符(52个字母、个字母、10个数字、个数字、32个标点符号、空格)个标点符号、空格) - 使用使用man ascii查看查看19.10 ASCII码;排序序列码;排序序列l排序序列排序序列 - 在字符编码方案中,字符组织
13、的顺序称为在字符编码方案中,字符组织的顺序称为排序序列排序序列。 - sort按排序序列进行排序按排序序列进行排序19.10 ASCII码;排序序列码;排序序列lASCII码的码的排序序列排序序列 - 重点记住重点记住3个基本准则个基本准则 1. 空格在数字之前;空格在数字之前; 2. 数字在大写字母之前;数字在大写字母之前; 3. 大写字母在小写字母之前。大写字母在小写字母之前。19.11 区域设置和排序序列区域设置和排序序列l区域设置区域设置 - 区域设置是一种技术规范,描述与特定文化区域设置是一种技术规范,描述与特定文化的用户通信时应该使用的语言和习俗。的用户通信时应该使用的语言和习俗。
14、 - 环境变量环境变量LC_COLLATE中保存了区域设置中保存了区域设置的值。的值。 - 可以使用可以使用locate -a查看系统支持的区域设查看系统支持的区域设置。置。19.11 区域设置和排序序列区域设置和排序序列l美国的两种区域设置美国的两种区域设置 - C/POSIX:基于:基于ASCII - en_US:基于字典序:基于字典序19.11 区域设置和排序序列区域设置和排序序列l例子:给例子:给A,a,C,c,B,b排序排序 - ASCII排序结果:排序结果: A,B,C,a,b,c - 字典序排序结果:字典序排序结果: a,A,b,B,c,C4. uniq命令命令uniq简介简介l
15、功能:功能: (1) 消除重复行(缺省功能);消除重复行(缺省功能); (2) 选取重复行;选取重复行; (3) 选取唯一行;选取唯一行; (4) 统计重复行的数量。统计重复行的数量。19.12 查找重复行:查找重复行:uniqluniq的语法定义:的语法定义: uniquniq - -cducdu infile outfile 其中: infile:输入文件名称:输入文件名称 outfile:输出文件名称:输出文件名称 -c:统计重复行的数量:统计重复行的数量 -d:选取重复行:选取重复行 -u:选取唯一行:选取唯一行 注意:注意: infile必须是有序的必须是有序的19.12 查找重复行
16、:查找重复行:uniql例例1,有文件,有文件data,内容如下:,内容如下:A1A1BarbaraBarbaraCharles$ uniq dataA1BarbaraCharles$ uniq -d dataA1Barbara$ uniq -u dataCharles$ uniq -c data2 A12 Barbara1 Charles19.12 查找重复行:查找重复行:uniql例例2,取两个文件的交集,取两个文件的交集 sort file1, file2 | uniq -d5. join命令命令join简介简介l功能:功能: 合并两个文件中的有序数据。合并两个文件中的有序数据。19.1
17、3 合并两个文件中的有序数据:合并两个文件中的有序数据:joinl语法定义:语法定义: join -i -a1|-v1 -a2|-v2 -1 field1 -2 field2 file1 file2 其中:其中: field1、field2:引用特定字段的数字:引用特定字段的数字file1、file2:包含有序数据的文件:包含有序数据的文件 -a:all-v:reverse -i:ignore case19.13 合并两个文件中的有序数据:合并两个文件中的有序数据:joinl例子,有文件例子,有文件birthdays和和gifts,内容如下:,内容如下: A 1987-5-10B 1992-2
18、-2D 1990-4-8F 1991-10-15G 1992-1-17A moneyB chocolateC musicD booksE camera$ join birthdays giftsA 1987-5-10 moneyB 1992-2-2 chocolateD 1990-4-8 books$ join -a1 birthdays giftsA 1987-5-10 moneyB 1992-2-2 chocolateD 1990-4-8 booksF 1991-10-15G 1992-1-17 $ join -a1 -a2 birthdays giftsA 1987-5-10 money
19、B 1992-2-2 chocolateC musicD 1990-4-8 booksE CameraF 1991-10-15G 1992-1-17 $ join -v1 birthdays giftsF 1991-10-15G 1992-1-17 6. tsort命令命令tsort简介简介l功能:功能:由偏序创建全序由偏序创建全序。19.14 由偏序创建全序:由偏序创建全序:tsortl偏序偏序 每个关于顺序的约束称为一个偏序(每个关于顺序的约束称为一个偏序(partial ordering)l全序全序 排序对象整体上是有序的排序对象整体上是有序的19.14 由偏序创建全序:由偏序创建全序:
20、tsortl语法定义:语法定义: tsort file 其中:其中: file: 输入文件的名称。输入文件的名称。file的每一行必的每一行必须须 包含一对由空白符分隔的字符串。包含一对由空白符分隔的字符串。 19.14 由偏序创建全序:由偏序创建全序:tsortl例子:文件例子:文件activities内容如下内容如下 clean-disheswatch-TVeatclean-dishesshopcookshopput-away-foodput-away-food cookcook eatput-away-food watch-TV$ tsort activitiesshopput-away
21、-foodcookeatclean-disheswatch-TV 7. strings命令命令strings简介简介l功能:功能:在二进制文件中抽取字符串在二进制文件中抽取字符串。19.15 在二进制文件中抽取字符串在二进制文件中抽取字符串l字符串字符串 任何一个可显示字符序列都称为一个字符串任何一个可显示字符序列都称为一个字符串l文本文件文本文件 只包含可显示字符串和新行字符的文件称为文只包含可显示字符串和新行字符的文件称为文本文件或本文件或ASCII文件文件l二进制文件二进制文件 任何非文本文件的非空文件,都是二进制文件任何非文本文件的非空文件,都是二进制文件19.15 在二进制文件中抽取
22、字符串在二进制文件中抽取字符串l语法定义:语法定义: strings -length file 其中:其中: length:要显示的字符串的最小长度。:要显示的字符串的最小长度。默认长默认长度是度是4 19.15 在二进制文件中抽取字符串在二进制文件中抽取字符串l例子:例子: $ strings /usr/bin/sort $ strings -7 /usr/bin/sort | sort -u $ strings -7 date | sort -u | less 8. tr命令命令tr简介简介l功能:功能:(1) 转换转换字符字符,即将字符转换成其它字符,如,即将字符转换成其它字符,如小写字
23、母转换成大写字母;小写字母转换成大写字母;(2) 挤压字符,即将连续出现的字符,用一个挤压字符,即将连续出现的字符,用一个单独的字符来替换;单独的字符来替换;(3) 删除字符。删除字符。19.16 转换字符:转换字符:trl语法定义:语法定义: tr -cds set1 set2 其中:其中: set1、set2 :字符组:字符组 注意:注意: 没有输入文件参数,是纯过滤器。没有输入文件参数,是纯过滤器。19.16 转换字符:转换字符:trl例子:例子: $ tr a A old $ tr abc ABC old $ tr abcde Ax old $ tr abcde Axxxx old $
24、 tr :;? . old 19.16 转换字符:转换字符:trl例子:例子: $ tr a-z A-Z old $ tr 0-9 A-J old $ tr :lower: :upper: old $ tr :digit: A-J old 19.17 转换不可显示字符转换不可显示字符l有哪些可转换的不可显示字符有哪些可转换的不可显示字符 代码代码控制键控制键八进制代码八进制代码名称名称bH010BackspacetI011TabnJ012新行新行rM015Return反斜线反斜线19.17 转换不可显示字符转换不可显示字符l例子:例子: $ tr r n old $ tr 015 012 ol
25、d $ tr t old $ tr 011 old 19.18 转换字符:高级话题转换字符:高级话题ltr命令的命令的3个选项:个选项: -s:多个连续字符替换为一个单独的字符。:多个连续字符替换为一个单独的字符。 例子:例子: $ tr -s :digit: X olddata $ tr -s olddata19.18 转换字符:高级话题转换字符:高级话题ltr命令的命令的3个选项:个选项: -d:删除指定的字符。:删除指定的字符。 例子:例子: $ tr -d () olddata $ tr -d :digit: olddata19.18 转换字符:高级话题转换字符:高级话题ltr命令的命
26、令的3个选项:个选项: -c:匹配所有不在第一个字符组中的字符。:匹配所有不在第一个字符组中的字符。 例子:例子: $ tr -c n X olddata 9. sed命令命令sed简介简介l读音:读音: sedl全称:全称:Stream EDitorl功能:功能:非交互式字符流编辑器。非交互式字符流编辑器。19.19 非交互式文本编辑:非交互式文本编辑:sedl语法定义:语法定义: sed -i command | -e command file 其中:其中: command:sed命令命令 -i:将输出写入到临时文件,处理完成后,:将输出写入到临时文件,处理完成后, 用临时文件覆盖输入文件
27、。用临时文件覆盖输入文件。 19.19 非交互式文本编辑:非交互式文本编辑:sedlsed命令执行流程:命令执行流程: (1) 从输入流中读取一行。从输入流中读取一行。 (2) 执行指定的命令,对该命令进行必要的转换。执行指定的命令,对该命令进行必要的转换。 (3) 将该行写入到输出流中。将该行写入到输出流中。 19.20 使用使用sed进行替换进行替换ls命令:命令: /address| pattern/s/search/replacement/g 其中:其中: address:输入流中一个或多个行的地址:输入流中一个或多个行的地址pattern:字符串:字符串search:正则表达式:正则
28、表达式replacement:替换文本:替换文本 g:改变所有的匹配字符串,默认只改变每行的第:改变所有的匹配字符串,默认只改变每行的第 一个匹配字符串一个匹配字符串19.20 使用使用sed进行替换进行替换l例子:例子: $ sed s/harley/Harley/g names $ sed -i s/mMon/Monday/g calendar $ sed -i s/.$/ winfile19.21 告诉告诉sed只对指定行进行操作只对指定行进行操作l地址描述:地址描述: number,number | /regex/ 其中:其中: number:行号:行号regex:正则表达式:正则表达
29、式19.21 告诉告诉sed只对指定行进行操作只对指定行进行操作l例子:例子: $ sed 5s/harley/Harley names $ sed 5,10s/harley/Harley names $ sed $s/harley/Harley names $ sed 5, $s/harley/Harley names19.21 告诉告诉sed只对指定行进行操作只对指定行进行操作l例子:例子: $ sed /ok/s/harley/Harley names $ sed /0-9 0-9/s/harley/Harley names19.22 使用非常长的使用非常长的sed命令命令l方法方法1:使用:使用-e选项选项 例如:例如: $ sed -i -e s/mon/Monday/g -e s/tue/Tuesday/g -e s/wed/Wednesday/g -e s/thu/Thursday/g calendar19.22 使用非常长的使用非常长的sed命令命令l方法方法2:将命令写到文件中:将命令写到文件中 例如:命令存储在文件例如:命令存储在文件instructions中,对文中,对文件件input中数据进行操作:中数据进行操作: $ sed -f instructions input