《Unix & Linux 大学教程》 - 第十六、十七章 学习笔记
学习笔记,内容基础,适合初学者。
?
阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)
《Unix & Linux 大学教程》 - 第一、二章 学习笔记???Unix简介 & 什么是Linux?什么是Unix
《Unix & Linux 大学教程》 - 第三、四章 学习笔记? ?Unix连接 & 开始使用Unix
《Unix & Linux 大学教程》 - 第五、六章 学习笔记? ?GUI:图形用户界面 & Unix工作环境
《Unix & Linux 大学教程》 - 第七、八章 学习笔记? ?Unix键盘使用 & 能够立即使用的程序
《Unix & Linux 大学教程》 - 第九、十章 学习笔记? ?文档资料:Unix手册与Info & 命令语法
《Unix & Linux 大学教程》 - 第十一、十二章 学习笔记? ?shell & 使用shell:变量和选项
《Unix & Linux 大学教程》 - 第十三章 学习笔记? ?使用shell:命令和定制
《Unix & Linux 大学教程》 - 第十四、十五章 学习笔记???使用shell:初始化文件
《Unix & Linux 大学教程》 - 第十六、十七章 学习笔记? ?过滤器:简介和基本操作第十六章:过滤器:简介和基本操作
?
?
基础知识:
cat(catenate,to join in a chain)
每次一行从标准输入读取数据,完成处理后将结果每次一行的写到标准输出。
执行cat后,控制台等待输入,按下return时,之前键入的一行发送到cat,然后cat再输出,所以在屏幕上面可以看到两行相同内容的输出。
作用
在管道中不需要使用
在I/O重定向中应用较多
cat > data
将标准输出重定向到data,可以快速建立文件。当然也可以追加到文件(>>)。
cat < data
将data作为cat的标准输入,输出到屏幕上。这里重定向符号可以省略(cat data)。cat没有翻页功能,当文件内容较多的时候,只显示文件最后的内容。
cat < data > newdata
可以利用cat 复制文件。
cat?[file...]
可以利用cat从多个文件读取收集数据(大多数过滤器都允许指定多个文件名作为参数)。
?
不要将输出重定向到一个文件上
cat name address > name
上面的命令无法完成任务!原因在于shell处理重定向的方式。在冲虚将标准输出重定向到文件之前,shell必须确保这个文件存在并且是空的,如果不存在,shell将其创建;如果存在,shell将其清空。
首先name被清空,然后address输出到name中, 和cat address > name的结果是一样的,shell会给出提示:
cat: name: input file is output file
但是这时name已经被清空了!
可以改用cat address >> name
?
cat?[-bns] [file...]
-n(number):在每行前面加一个行号
-b(blank):和-n一起使用,告诉cat不要对空白行编号
-s(squeeze):将多个连续空白行替换为一个空白行
?
书中一个cat应用总结,都是上面将过的内容,而且有些还是重复的。
语法作用cat > file从键盘读取数据,创建新文件或者替换已有文件cat >> file从键盘读取数据,将数据追加到已有文件中cat < file显示一个已有文件cat file显示一个已有文件cat <file1 > file2复制文件cat file1 file2 file3 | less组合多个文件,每次一屏的显示结果。cat file1 file2 file3 > file4组合多个文件,将输出保存到一个不同文件中cat file1 file2 file3 | program组合多个文件,将输出管道出送给另一个程序?
split
语法
split?[-d] [-a?num] [-l?lines] [file?[prefix]]
num是创建文件名时用作文件名后缀的字符或者数字数量
lines是每个新文件所包含行的最大数量
file是输入文件的名称
prefix是创建文件时使用的名称
?
split默认创建1000行数据的文件
split data(将data分割为若干个每个含1000行数据的文件)
split -l 5000 data(将data分割为若干个每个含5000行数据的文件)
?
split默认以字母x开头,类似于
xaa ?xab ?xac ?xad ?xae ?xaf ?xag ?xah ?xai
如果之前有同名文件,则被覆盖。
?
split -d -l 5000 data
改用数字做后缀
x00 x01 x02 x03 ......
?
split -d -l 5000 data y
修改文件名前缀
y00 y01 y02 y03 ......
?
split -a 3 data
split -d -a 3 data
设置文件名后缀长度
xaaa xaab xaac xaad ......
x001 x002 x003 x004 ......
?
tac
语法
tac?[file...]
tac将文本写入标准输出之前,将文本行的顺序反转(第一行成为最后一行,第二行成为倒数第二行……)。
tac log > reverse-log
将log文件行反转之后输出到reverse-log中。
?
rev
语法
rev?[file...]
?
反转字符顺序
rev data | tac
即反转了行,也反转了每行的字符。
?
head、tail
语法
head?[-n?lines]
tail?[-n?lines]
head从数据的开头许选择数据行
tail从数据的结尾选择数据行
head、tail默认选取10行数据
cat data1 data2 | sort | tail -n 300 | less
cat data1 data2 | sort | head > newdata
(第21章将介绍head、tail的复杂语法项)
?
colrm(column remove)
语法
colrm?[startcol?[endcol]]
程序从标准输入读取数据,删除指定的数据列,然后将剩余数据写入标准输出。
其中startcol和endcol指定要移除奇遇的开头和末尾。列的编号从1开始。
比如,我的一个文件名为text的文本文件中有如下两行数据:
1234567
abcdefg
那么我想删除第3-5列
cat text | colrm 3 5
结果为(当然,上面的命令没有改变text文件本身):
1267
abfg
注意:列的编号从1开始,并且是闭区间,而非半开半闭。
?
?
?
?
第十七章:过滤器:比较和抽取
基础知识:
重要的文件比较程序和排序文件以及从文件中选取数据的相关程序
过滤器作用章号文件类型文件数量cmp比较两个文件17二进制或者文本2个comm比较两个有序文件,显示区别17文本:有序2个diff比较两个文件,显示区别17文本2个sdiff比较两个文件,显示区别17文本2个cut从数据中抽取指定列(字段)17文本1个或多个paste组合数据列17文本1个或多个sort排序数据19文本1个或多个uniq选取重复/唯一行19文本1个grep选取包含指定模式的行19文本个或多个look选取以指定模式开头的行19文本:有序1个?
cmp
语法
cmp?file1 file2
逐字节的比较,如果相同,则无任何输出,否则会看到如下类似提示:
file1 file2 differ: byte 4, line 1
无须关心文件类型
?
comm
语法
comm?[-123]?file1?file2
按行比较两个有序文件,并显示区别。
该程序以3列显示输出:
第一列:包含只在第一个文件中有的行
第二列:包含只在第二个文件中有的行
第三列:包含两个文件都有的行
?
diff
语法
diff?[-bBiqswy] [-c|-Clines|-u|-Ulines] file1 file2
lines是说明上下文关系的行号
diff输出使用3个不同的单字符指示:
c(change):改变
d(delete):删除
a(append):追加
每个字符左右都会有一串行号,左边的数字指第一个文件中的行,右边的数字指第二个文件中的行。
第一个文件中的行由“<”(小于号)字符标记;第二个文件中的行由一个“>”(大于号)字符标记。两组行被由若干个连字符构成的直线分隔。
我们来比较一下android4.0和android4.1的package/app下有神马变化
ls -1 /media/dfaf020c-d352-4c0d-ba00-71a419011550/android4.0/packages/apps > android40
ls -1 /media/dfaf020c-d352-4c0d-ba00-71a419011550/android4.1/packages/apps > android41
将packages/apps下的文件列表写到文件中,每行一个文件
然后比较一下这两个文件
?
diff android41 android40
log如下:
18d17< LegacyCamera18d17是说如果第一个文件这样做,那么就能和第二个文件相同。那么18d17是神马意思,d表示删除,在第一个文件中删除第18行,那么就和第二个文件相同了(17可以省略,表示在第二个文件中第17行后发现了区别)
?
下面再用同样的方法看看4.0和4.1中Camera下的文件列表区别:
ls -1 /media/dfaf020c-d352-4c0d-ba00-71a419011550/android4.1/packages/apps/Camera > android41
上面截取了部分结果,同之前的passwd文件基本一致,因为没有加分隔符
每列的之间放置了一个制表符(默认),Unix假设制表符为每8个位置一个,且以位置1为起点。
指定冒号为分隔符
paste -d ':' /home/su1216/linux_test/c1?/home/su1216/linux_test/c2?/home/su1216/linux_test/c3?/home/su1216/linux_test/c4 >?/home/su1216/linux_test/c
也可以指定多个分隔符,当有多个分隔符时,paste交替使用分隔符。
paste -d '|&' /home/su1216/linux_test/c1?/home/su1216/linux_test/c2?/home/su1216/linux_test/c3?/home/su1216/linux_test/c4 >?/home/su1216/linux_test/c
结果如下
?
名词解释:
version control system:版本控制系统
source code control system(SCCS):代码控制系统
revision control system(RCS):修订控制系统
comma-separated value(CSV):逗号分隔值
?
一些有用的过滤器
过滤器章号参阅作用awk--perl编程语言:操作文本cat16split、tac、rev组合文件:复制标准输入到标准输出colrm16cut、join、paste删除指定的数据列comm17cmp、diff、sdiff比较两个有序文件,显示区别cmp17comm、diff、sdiff比较两个文件cut17colrm、join、paste从数据中抽取指定列(字段)diff17cmp、comm、sdiff比较两个文件,显示不同expand18unexpand将制表符转为空格fold18fmt、pr将长行格式化成较短的行fmt18fold、pr格式化段落,从而使它们看上去更漂亮grep19look、strings选择包含指定模式的行head16tail从数据的开头选择行join19colrm、cut、paste
基于公用字段,组合数据列look19grep选择以指定模式开头的行nl18wc创建行号paste17colrm、cut、join组合数据列perl--awk编程语言:操作文本,文件,进程pr18fold,fmt将文本格式化为页或者列rev16cat、tac每行数据中的字符反序排列sdiff17cmp、comm、diff比较两个文件,显示区别sed19tr非交互式文本编辑sort19tsort、uniq排序数据:检查数据是否有序split16cat将大文件分隔成较小的文件strings19grep在二进制文件中搜索字符串tac16cat、rev组合文件,同时将文本行的顺序反转tail16head从数据的末尾选择行tr19sed改变或者删除选定的字符tsort19sort根据偏序创建全序unexpand18expand将空格转变成制表符uniq19sort选择重复/唯一行wc18nl统计行数、单词数和字符数?
?
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/