1、查找并修补文件差异
当文件存在多个版本时,如果能够重点标记出这些版本之间的不同而无须通过人工查看来比较,那就简直是太棒了。当多名开发人员共事时,某个人对于文件的修改必须告知其他人。要是发送整个源代码的话,可是一件耗时的活儿。这时,发送一个差异文件就显得很有用了,因为该文件中只包含那些被修改、添加或删除的行以及行号。这种差异文件叫作修补文件(patch file)。我们可以用patch命令将修补文件中包含的变更信息应用到原始文件,也可以再次进行修补来撤销变更。
a. diff 命令
- 描述:生成两个文件之间的差异对比
- 语法:diff [选项] file1 file2
-u 一体化形式输出
# version1.txt
this is the original text
line2
line3
line4
happy hacking !
# version2.txt
this is the original text
line2
line4
happy hacking !
GNU is not UNIX
# 非一体化形式输出
diff version1.txt version2.txt
# 一体化形式输出
diff -u version1.txt version2.txt
- -u用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件之间的差异,所以人们往往更喜欢这种输出形式。
- 在一体化diff输出中,以+起始的是新加入的行,以-起始的是被删除的行。
b. patch 命令
- 描述:对文件进行修补
- 语法:patch [选项] 目标文件的反文件 < 差异文件
-R: 不会提示用户y/n。
-N:将缺失的文件视为空文件。
-a:将所有文件视为文本文件。
-u:生成一体化输出。
-r:递归遍历目录下的所有文件
# 修补文件可以通过将diff的输出重定向到一个文件来生成
diff -u version1.txt version2.txt > version.patch
# 查看差异文件
cat version.patch
现在就可以用patch命令将变更应用于其中任意一个文件。当应用于version1.txt时,就可以得到version2.txt;而当应用于version2.txt时,就得到了version1.txt。
# 修补 version1.txt 文件
patch -p1 version1.txt < version.patch
# 查看 version1.txt
cat version1.txt
- version1.txt的内容现在和version 2.txt一模一样了。
# 以撤销作出的变更,,对已修补过的文件再修补将撤销作出的变更
patch -p1 version1.txt < version.patch
2、打印前10后10
cat命令并不适合查看上千行的大文件,因为它会把整个文件内容全部给打印出来。相反,我们只想查看文件的一小部分内容(例如文件的前10行或后10行)。有时候可能是文件的前n行或后n行,也可能是除了前n行或后n行之外所有的行,亦或是第m行至第n行。
a. head 命令
- 描述:从文件首行去读文件,默认读取10行。
- 语法:head [选项] filename
-n: 指定显示多少行
# 打印前10行
head filename
# 从stdin读取数据
cat test | head
# 指定打印前几行
head -n 4 filename
# 打印除了最后M行之外所有的行
# 打印出除最后5行之外的所有行
seq 11 | head -n -5
- 注意:这里的-M表示的是负数,并非选项
b. tail 命令
- 描述:从文件尾行读取数据,默认读取10行
- 语法:tail [选项] filename
-n: 指定显示多少行
-f或--follow,允许tail关注文件内容的更新并将其显示出来
# 打印文件的最后10行
tail filename
# 从stdin中读取输入
cat filename | tail
# 打印最后5行
tail -n 5 filename
# 打印除了前M行之外所有的行:tail -n +(M+1)
seq 100 | tail -n +6 # 输出 6-100
# 监视日志文件内容增加
tail -f /var/log/messages
c. dmesg 命令
- 描述:查看内核的环形缓冲区消息
- 语法:dmesg
我们通常使用该命令调试USB设备、检查磁盘操作或是监视网络连接性。-f还可以加入一个睡眠间隔-s,这样我们就可以设置监视文件更新的时间间隔了。
dmesg | tail -f
3、只列出目录
用脚本只列出目录不是件容易事。有很多种方法可以只列出目录。dir类似于ls,但选项更少。另外也可以使用ls和find来列出目录。
# 使用ls -d
ls -d */
# 使用grep结合ls -F:
ls -F | grep "/$"
# 使用awk 结合 grep结合ls -l
ls -l | grep "^d" | awk '{print $9}'
# 使用find
find ./ -type d -maxdepth 1 -print
- 使用ls的-F选项时,所有的输出项后面都会多出一个代表文件类型的字符,如@、*、|等。目录对应的是/字符。我们用grep只过滤那些行尾标记为/$的输出项。