Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380836
  • 博文数量: 114
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1219
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-07 21:23
文章分类

全部博文(114)

文章存档

2018年(1)

2017年(5)

2016年(87)

2015年(21)

我的朋友

分类: 系统运维

2016-04-12 17:47:39


  1. diff
  2. diff 就是用在比对两个文件之间的差异的,并且是以行为单位来比对的!一般是用在 ASCII 纯文字档的比对上。 由於是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)的新旧版本差异上! 举例来说,假如我们要将 /etc/passwd 处理成为一个新的版本,处理方式为: 将第四行删除,第六行则取代成为『no six line』,新的文件放置到 /tmp/test 里面,那么应该怎么做?

  3. [root@www ~]# mkdir -p /tmp/test <==先创建测试用的目录
  4. [root@www ~]# cd /tmp/test
  5. [root@www test]# cp /etc/passwd passwd.old
  6. [root@www test]# cat /etc/passwd | \
  7. > sed -e '4d' -e '6c no six line' > passwd.new
  8. # 注意一下, sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行!
  9. # 透过这个动作,在 /tmp/test 里面便有新旧的 passwd 文件存在了!
  10. 接下来讨论一下关於 diff 的用法吧!

  11. [root@www ~]# diff [-bBi] from-file to-file
  12. 选项与参数:
  13. from-file :一个档名,作为原始比对文件的档名;
  14. to-file :一个档名,作为目的比对文件的档名;
  15. 注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。

  16. -b :忽略一行当中,仅有多个空白的差异(例如 "about me""about me" 视为相同
  17. -B :忽略空白行的差异。
  18. -i :忽略大小写的不同。

  19. 范例一:比对 passwd.old 与 passwd.new 的差异:
  20. [root@www test]# diff passwd.old passwd.new
  21. 4d3 <==左边第四行被删除 (d) 掉了,基准是右边的第三行
  22. < adm:x:3:4:adm:/var/adm:/sbin/nologin <==这边列出左边(<)文件被删除的那一行内容
  23. 6c5 <==左边文件的第六行被取代 (c) 成右边文件的第五行
  24. < sync:x:5:0:sync:/sbin:/bin/sync <==左边(<)文件第六行内容
  25. ---
  26. > no six line <==右边(>)文件第五行内容
  27. # 很聪明吧!用 diff 就把我们刚刚的处理给比对完毕了!
  28. 用 diff 比对文件真的是很简单喔!不过,你不要用 diff 去比对两个完全不相干的文件,因为比不出个啥咚咚! 另外, diff 也可以比对整个目录下的差异喔!举例来说,我们想要了解一下不同的启动运行等级 (runlevel) 内容有啥不同?假设你已经知道运行等级 3 与 5 的启动脚本分别放置到 /etc/rc3.d 及 /etc/rc5.d , 则我们可以将两个目录比对一下:

  29. [root@www ~]# diff /etc/rc3.d/ /etc/rc5.d/
  30. Only in /etc/rc3.d/: K99readahead_later
  31. Only in /etc/rc5.d/: S96readahead_later
  32. 我们的 diff 很聪明吧!还可以比对不同目录下的相同档名的内容,这样真的很方便喔~


  1. 格式化列印: printf
  2. 在很多时候,我们可能需要将自己的数据给他格式化输出的! 举例来说,考试卷分数的输出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧? 例如我想要输出底下的样式:

  3. Name Chinese English Math Average
  4. DmTsai 80 60 92 77.33
  5. VBird 75 55 80 70.00
  6. Ken 60 90 70 73.33
  7. 上表的数据主要分成五个栏位,各个栏位之间可使用 tab 或空白键进行分隔。 请将上表的数据转存成为 printf.txt 档名,等一下我们会利用这个文件来进行几个小练习的。 因为每个栏位的原始数据长度其实并非是如此固定的 (Chinese 长度就是比 Name 要多), 而我就是想要如此表示出这些数据,此时,就得需要列印格式管理员 printf 的帮忙了! printf 可以帮我们将数据输出的结果格式化,而且而支持一些特殊的字符~底下我们就来看看!

  8. [root@www ~]# printf '列印格式' 实际内容
  9. 选项与参数:
  10. 关於格式方面的几个特殊样式:
  11.        \a 警告声音输出
  12.        \b 倒退键(backspace)
  13.        \f 清除萤幕 (form feed)
  14.        \n 输出新的一行
  15.        \r 亦即 Enter 按键
  16.        \t 水平的 [tab] 按键
  17.        \v 垂直的 [tab] 按键
  18.        \xNN NN 为两位数的数字,可以转换数字成为字节。
  19. 关於 C 程序语言内,常见的变量格式
  20.        %ns 那个 n 是数字, s 代表 string ,亦即多少个字节;
  21.        %ni 那个 n 是数字, i 代表 integer ,亦即多少整数码数;
  22.        %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数,
  23.              假设我共要十个位数,但小数点有两位,即为 %10.2f 罗!
  24. 接下来我们来进行几个常见的练习。假设所有的数据都是一般文字 (这也是最常见的状态),因此最常用来分隔数据的符号就是 [Tab] 啦!因为 [Tab] 按键可以将数据作个整齐的排列!那么如何利用 printf 呢?参考底下这个范例:

  25. 范例一:将刚刚上头数据的文件 (printf.txt) 内容仅列出姓名与成绩:([tab] 分隔)
  26. [root@www ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
  27. Name Chinese English Math Average
  28. DmTsai 80 60 92 77.33
  29. VBird 75 55 80 70.00
  30. Ken 60 90 70 73.33
  31. 由於 printf 并不是管线命令,因此我们得要透过类似上面的功能,将文件内容先提出来给 printf 作为后续的数据才行。 如上所示,我们将每个数据都以 [tab] 作为分隔,但是由於 Chinese 长度太长,导致 English 中间多了一个 [tab] 来将数据排列整齐!啊~结果就看到数据对齐结果的差异了!

  32. 另外,在 printf 后续的那一段格式中,%s 代表一个不固定长度的字串,而字串与字串中间就以 \t 这个 [tab] 分隔符号来处理!你要记得的是,由於 \t 与 %s 中间还有空格,因此每个字串间会有一个 [tab] 与一个空白键的分隔喔!

  33. 既然每个栏位的长度不固定会造成上述的困扰,那我将每个栏位固定就好啦!没错没错!这样想非常好! 所以我们就将数据给他进行固定栏位长度的设计吧!

  34. 范例二:将上述数据关於第二行以后,分别以字串、整数、小数点来显示:
  35. [root@www ~]# printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt |\
  36. > grep -v Name)
  37.     DmTsai 80 60 92 77.33
  38.      VBird 75 55 80 70.00
  39.        Ken 60 90 70 73.33
  40. 上面这一串格式想必您看得很辛苦!没关系!一个一个来解释!上面的格式共分为五个栏位, %10s 代表的是一个长度为 10 个字节的字串栏位,%5i 代表的是长度为 5 个字节的数字栏位,至於那个 %8.2f 则代表长度为 8 个字节的具有小数点的栏位,其中小数点有两个字节宽度。我们可以使用底下的说明来介绍 %8.2f 的意义:

  41. 字节宽度: 12345678
  42. %8.2f意义:00000.00
  43. 如上所述,全部的宽度仅有 8 个字节,整数部分占有 5 个字节,小数点本身 (.) 占一位,小数点下的位数则有两位。 这种格式经常使用於数值程序的设计中!这样了解乎?自己试看看如果要将小数点位数变成 1 位又该如何处理?

  44. printf 除了可以格式化处理之外,他还可以依据 ASCII 的数字与图形对应来显示数据喔(注3)! 举例来说 16 进位的 45 可以得到什么 ASCII 的显示图 (其实是字节啦)

  45. 范例三:列出 16 进位数值 45 代表的字节为何?
  46. [root@www ~]# printf '\x45\n'
  47. E
  48. # 这东西也很好玩~他可以将数值转换成为字节,如果你会写 script 的话,
  49. # 可以自行测试一下,由 20~80 之间的数值代表的字节是啥喔! ^_^
  50. printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程序语言当中使用的萤幕输出, 都是利用 printf 呢!鸟哥这里也只是列出一些可能会用到的格式而已,有兴趣的话,可以自行多作一些测试与练习喔! ^_^

  51. 转自
阅读(1210) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~