Unix & Linux 笔记(10)
2016-05-27 16:10
441 查看
第19章 过滤器:选取、排序、组合及变换
19.1 选取包含特定模式的行:grep
grepre = regular expression ed中的搜索
g/re/pgre
grep [-cilLnrsvwx] patter [file...]
19.2 最重要的grep
选项
-c count,统计所抽取行的数量 -i 忽略大小写 -n 在输出行前加上行号 -l list filename,当不只在一个文件中搜索时,结果列举文件名 -L 与-l相反,列举不包含匹配模式的文件名 -w 指定只希望搜索完整的单词 -v reverse,选取不包含指定模式的所有行 -x 完全由搜索模式构成的行 -r recursive,搜索整个目录树 -s suppress,忽略错误消息
19.3 grep
的变体:fgrep
、egrep
grep –E
19.4 选取以特定模式开头的行:look
look搜索以字母顺序排列的数据,并查找所有以特定模式开头的行。
look的使用方式有两种,一种用一个或多个文件中的有序数据,另一种就是让
look搜索一个字典。
look [-df] patter file... -d dictionary,只考虑字母和数字,忽略标点和其他特殊符号 -f fold,忽略大小写
look不能从标准输入中读取数据,它必须从一个或多个文件中获取输入,不能严格的被称为过滤器。(
look采用“二分查找法”,怎么可能一行一行的读取数据!)
19.5 使用look
和grep
的时机
look的三个限制:a) 要求有序输入;
b) 只能从文件中读取数据,不能从标准输入中读取数据;
c) 只能在行的开头搜索指定的模式。
建议,凡事先考虑
look。基于简单性和易用性选择工具,而不必在意速度或效率上的微小差别。当编写程序(包括
shell脚本)时,这尤为重要。如果程序或者脚本太慢,通常可以找到一两个影响速度的瓶颈,从而提高他们的速度。但是,如果程序的复杂或者难以使用的程度超出必要,那么从长远来看,他将浪费时间,相对于计算机时间来说,这样的代价更高。
19.6 查找以特定模式开头的所有单词:look
look patter
字典文件
dictionary file
spell->
aspell显示文档中有但是字典文件中没有的单词清单。
aspell -c file
19.7 排序数据:sort
排序数据以及查看数据是否已经有序。sort [-dfnru] [-o outfile] [infile...] -o write result to outfile instead of standard output
19.8 控制数据排序的顺序:sort –dfnru
-d (字典)当数据中包含妨碍排序的字符(如标点符号)时使用该选项 -f fold,等同 -n 识别行开头或字段开头的数字,并按数字排序 -r reverse,反序 -u unique,查找相同的行,并将相同的行值留下一行
19.9 检查数据是否有序:sort –c
sort -c[u] [file] -c cheak,不进行排序,只是检查数据是否有序 -u 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
19.9 ASCII
码:排序序列
American Standard Code for Information Interchange 美国信息交换标准码数字 | 意义 |
---|---|
32 | space |
48-57 | 数字0-9 |
65-90 | 大写字符 |
97-122 | 小写字母 |
19.11 区域设置和排序序列
locale -a LC_COLLATE=C(POSIX)/en_US(zh_CN)
19.12 查找重复行:uniq
uniq [-cdu] [infile [outfile]] -c 统计重复行出现的次数 -d 只查看重复行 -u 只查看唯一行 uniq file 生成包含该文件的所有行,但没有重复行输出
19.13 合并两个文件中的有序数据:join
基于特定的字段的值将两个有序文件组合在一起。join [-i] [-a1 | -v1] [-a2 | -v2] [-l field1] [-2 field2] file1 file2 -i 忽略大小写 -a all,输出第1/2个文件中的所有record,即使没有匹配 -v reverse,查看不匹配的行 -1 field 改变第一个文件的联接字段 -2 field 改变第二个文件的联接字段
field1和
field2是引用特定字段的数字,
file1和
file2是有序数据文件。当
join读取输出时,忽略前导空白符。
join假定各个字段之间用空白符分隔。当基于匹配的字段组合两组数据时,称之为联接,用来匹配的具体字段称为联接字段(
join field)。
join,默认联接字段每个文件的第一个字段。
当以常规方式使用
join(没有
-a选项)时,所获得的结果称为内联接(
inner join),对于内联接来说,输出只包含联接字段匹配的行。当使用
-a1或
-a2时。输出还包含联接字段不匹配的行,称之为外联接(
outer join)。
19.14 由偏序创建全序:tsort
tsorttopological sort 拓扑排序,对不完全排序的文件实行完整的列表排序,如果不指定文件,或者文件为”-“,则从标准输入读取数据。
偏序
partial ordering
全序
total ordering
tsort [file] file,输入的每一行必须包含一对由空白符分隔的字符串,每一对字符串都代表一个偏序。
19.15 在二进制文件中搜索字符串:strings
大多数情况下,Unix的过滤器都是为处理文本文件设计的。
strings就是为了让程序员显示嵌在在可执行程序和对象文件中的字符串。
strings [-length] [file...]
length是要显示的字符串的最小长度,默认抽取至少4个字符长的字符串。
19.16 转化字符:tr
trtranslate
a) 将字符改变成其他字符
b) 字符连续出现时,用一根字符替换,又称为挤压(squeeze)字符
c) 删除指定的字符
tr [-cds] [set1 [set2]] -c complement首先补足set1 -d delete删除匹配set1的内容,并不作替换 -s squeeze如果匹配于set1的字符在输入序列中存在连续的
重复,在替换时会被统一缩为一个字符的长度
其中
set1和
set2是字符数组。注意该语法并不要求指定输入和输出文件名,这是因
为
tr是一个纯过滤器。
tr 0-9 A-J < old > new tr [:digit:] A-J < old > new tr abcde Ax < old > new tr abcde Axxxx < old > new
19.17 转换不可显示字符
各个操作系统如何标记行末OS | END |
---|---|
Unix | ^J |
Windows | ^M^J |
Macintosh OSX之前用
^M,之后用
^J
tr '\r' '\n' < macfile > unixfile
特殊代码
代码 | 名称 | 控制键 |
---|---|---|
\b | 退格 | ^H |
\t | 制表符 | ^I |
\n | 新行换行 | ^J |
\r | 回车 | ^M |
\\ | 反斜线 | - |
19.18 转换字符:高级话题
tr [-cds] [set1 [set2]] -s选项告诉tr第一组中的多个连续字符应该替换为一个单独的字符(挤压字符)。
tr -s '' '' < olddata > newdata
将连续的空格替换为一个单独的空格而不改变其他字符。
-d选项删除指定的字符,仅需定义一组字符
-c匹配所有1第一组中的字符
tr -c ' \n' X < olddata > newdata
保留原文本的映像
统计一组输入文件中的所含单词的数量:
cat file... | tr -cs [:alpha:]\' ""\n"" | sort –fu | wc –l
保存单词列表
cat file... | tr -cs [:alpha:]\' ""\n"" | sort –fu > file
19.19 非交互文本编辑器:sed
sed stream editor 流编辑器只谈简单的替换。
sed [-i] command | -e command... [file...] -i in-place,sed将输出保存在一个临时文件,编辑结束后替换原文件 sed 's/a/A/g' names > newnames
重要原则:
在进行重要永久性改变之前,尽可能地事先预览结果。
19.20 使用sed
进行替换
sed的功能来自于让它进行的操作。
[/address | patter/]s /search/replacement/[g]
address是输入流中一个或多个行的地址,
patter是一个字符串,
rearch是正则表达式,
replace是替换文本。
默认情况下,
sed只改变每一行第一个出现的匹配字符串,所以要在命令的末尾加上
g。
sed -i 's/[mM]on/Monday/g' calendar
Windows的文本文件在
Unix中的转换
不能使用
tr,因为需要将两个字符改成一个字符,
tr只能将一个字符变成另一个字符。只需查找并删除^M即可。
sed 's/.$//' winfile > unixfile
19.21 告诉sed
只对指定行进行操作
对特定行进行操作。地址语法number[,number] | /regex/
第一种,根据行号判读处理的行
sed '5s/a/A/g' names sed '5,$s/a/A/g' names
第二种,使用正则表达式或者被斜线字符包围的字符串
sed '/[0-9][0-9]/s/a/A/g' names sed '/OK/s/a/A/g' names
19.22 使用非常长的sed
命令
编写脚本存储于文件instruction中,使用文件
input中的数据。用
-f命令标识程序文件。
sed -f instructions input
脚本暂时不会
让
sed一次执行多个操作,使用
-e选项(editing command)。
sed -i –e 's/mon/Monday/g' -e 's/tue/Tuesday/g' calendar
相关文章推荐
- linux 内存释放命令
- Linux命令大全
- 初学linux命令-mkdir、rm、rmdir、mv
- linux运维实战精囊1(ifconfig,grep,cut,sed,awk)
- 【Linux】文件读写及cat命令的实现
- Linux下Nodejs安装
- kalilinux下wifi密码破解
- Linux之编辑器vim配置
- 为AM335x移植Linux内核主线代码(1)了解dtb
- linux 禁止账户远程登录
- Unix & Linux 笔记(9)
- Java Project项目在Linux下部署步骤及注意事项
- kali linux 执行update更新后不能install安装软件
- LinuxC/C++编程(7)—守护进程
- java project 项目在 linux 下面部署步骤
- 慕课linux学习笔记(九)常用命令(6)
- linux介绍与安装
- Unix & Linux笔记(8)
- Linux移植【0】NandFlash无法挂在根文件系统
- centos zookeeper 实战之集群搭建