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

全部博文(114)

文章存档

2018年(1)

2017年(5)

2016年(87)

2015年(21)

我的朋友

分类: 系统运维

2016-07-09 09:46:13


  1. DOS 断行字符与 Unix 断行字符, 可以使用
    dos2unix 与 unix2dos 来完成转换。好了,那么思考一下,是否还有其它常用的字符替代? 举例来说,
    要将大写改成小写,或者是 [tab] 按键转成空格键?还有,如何将两篇讯息整合成一篇? 底下我们就来
    介绍一下这些字符转换命令在管线当中的使用方法:

  2. tr
  3. tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换!
  4. [root@linux ~]# tr [-ds] SET1 ...
  5. 参数:
  6. -d :删除讯息当中的 SET1 这个字符串;
  7. -s :取代掉重复的字符!
  8. 范例:
  9. 范例一:将 last 输出的讯息中,所有的小写变成大写字符:
  10. [root@linux ~]# last | tr '[a-z]' '[A-Z]'
  11. 范例二:将 /etc/passwd 输出的讯息中,将冒号 (:) 删除
  12. [root@linux ~]# cat /etc/passwd | tr -d ':'
  13. 范例三:将 DOS 档案的断行字符 ^M 符号删除:
  14. [root@linux ~]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM
  15. # 那个 /r 指的是 DOS 的断行字符,关于更多的字符,请参考 man tr
  16. 其实这个指令也可以写在『正规表示法』里头!因为他也是由正规表示法的方式来取代数据的! 以上面的
  17. 例子来说,使用 [] 可以设定一串字呢! 也常常用来取代档案中的怪异符号! 例如上面第三个例子当中,
  18. 可以去除 DOS 档案留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统
  19. 中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 底下会自动的在每行行尾加入 ^M 这个断行符号!
  20. 这个时候我们可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之!
  21.  col
  22. [root@linux ~]# col [-x]
  23. 参数:
  24. -x :将 tab 键转换成对等的空格键
  25. 范例:
  26. [root@linux ~]# cat -A /etc/man.config <==此时会看到很多 ^I 的符号,那就是 tab
  27. [root@linux ~]# cat /etc/man.config | col -x | cat -A | more
  28. # 嘿嘿!如此一来, [tab] 按键会被取代成为空格键,输出就美观多了!
  29. 虽然 col 有他特殊的用途,不过,很多时候,他可以用来简单的处理将 [tab] 按键取代成为空格键! 例
  30. 如上面的例子当中,如果使用 cat -A 则 [tab] 会以 ^I 来表示。 但经过 col -x 的处理,则会将 [tab]
  31. 取代成为对等的空格键!
  32.  join
  33. join 看字面上的意义 (加入/参加) 就可以知道,他是在处理两个档案之间的数据, 而且,主要是在处理
  34. 『两个档案当中,有 "相同数据" 的那一行,将他加在一起』的意思。我们利用底下的简单例子来说明:
  35. [root@linux ~]# join [-ti12] file1 file2
  36. 参数:
  37. -t :join 预设以空格符分隔数据,并且比对『第一个字段』的数据,
  38. 如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
  39. -i :忽略大小写的差异;
  40. -1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
  41. -2 :代表『第二个档案要用那个字段来分析』的意思。
  42. 范例:
  43. 范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
  44. [root@linux ~]# join -t ':' /etc/passwd /etc/shadow
  45. bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7:::
  46. daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7:::
  47. adm:x:3:4:adm:/var/adm:/sbin/nologin:*:12959:0:99999:7:::
  48. # 因为 /etc/shadow 的权限问题,所以这里必须是 root 才能动作!而 /etc/passwd
  49. # 与 /etc/shadow 都是以 : 来分隔字段,所以必须要使用 -t ':' 规范字段分隔字符。
  50. # 且,因为 /etc/shadow 与 /etc/passwd 刚好都是以第一个字段为账号名称,所以,
  51. # 就可以将同一行的数据给他贴在一起了!
  52. # 另外,再仔细看一下 /etc/shadow 的内容与 /etc/passwd 的内容,您会发现,
  53. # 两者都以账号为开始,而上面的输出数据中您会发现特殊字体部分,那代表
  54. # 第二个档案的内容。在第二个档案的内容部分,由于账号(第一个字段)
  55. # 第一的档案是相同的,所以当然就省略掉,因此就成为上面的输出。
  56. 范例二:我们知道 /etc/passwd 第四个字段是 GID ,那个 GID 记录在
  57. /etc/group 当中的第三个字段,请问如何将两个档案整合?
  58. [root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
  59. 0:root:x:0:root:/root:/bin/bash:root:x:
  60. 1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
  61. 2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
  62. 4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:root,adm,daemon
  63. # 这个例子就更明显了!原本的 /etc/passwd 的第一行内容应该是:
  64. # root:x:0:0:root:/root:/bin/bash
  65. # 至于 /etc/group 第一行内容应该是:
  66. # root:x:0:
  67. # 我将第一个档案的第四栏与第二个档案的第三栏取出,放置到输出的最前方,
  68. # 然后将剩下的数据给他加在一起!就成了上面的输出啦!
  69. 这个 join 在处理两个相关的数据文件时,就真的是很有帮助的啦! 例如上面的案例当中,我的
  70. /etc/passwd, /etc/shadow, /etc/group 都是有相关性的, 其中 /etc/passwd, /etc/shadow 以账号为
  71. 相关性,至于 /etc/passwd, /etc/group 则以所谓的 GID (账号的数字定义) 来作为他的相关性。根据这
  72. 个相关性, 我们可以将有关系的资料放置在一起!这在处理数据可是相当有帮助的! 但是上面的例子有
  73. 点难,希望您可以静下心好好的看一看原因喔!
  74.  paste
  75. 这个 paste 就要比 join 简单多了! 相对于 join 必须要比对两个档案的数据相关性, paste 就直接 『将
  76. 两行贴在一起,且中间以 [tab] 键隔开』而已!简单的使用方法:
  77. [root@linux ~]# paste [-d] file1 file2
  78. 参数:
  79. -d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
  80. - :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
  81. 范例:
  82. 范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起
  83. [root@linux ~]# paste /etc/passwd /etc/shadow
  84. bin:x:1:1:bin:/bin:/sbin/nologin bin:*:12959:0:99999:7:::
  85. daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:12959:0:99999:7:::
  86. adm:x:3:4:adm:/var/adm:/sbin/nologin adm:*:12959:0:99999:7:::
  87. # 注意喔!同一行中间是以 [tab] 按键隔开的!
  88. 范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行
  89. [root@linux ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
  90. # 这个例子的重点在那个 - 的使用!那玩意儿常常代表 stdin 喔!
  91.  expand
  92. 这玩意儿就是在将 [tab] 按键转成空格键啦~可以这样玩:
  93. [root@linux ~]# expand [-t] file
  94. 参数:
  95. -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
  96. 我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
  97. 范例:
  98. 范例一:将 /etc/man.config 内行首为 MANPATH 的字样就取出;仅取前三行;
  99. [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3
  100. MANPATH /usr/man
  101. MANPATH /usr/share/man
  102. MANPATH /usr/local/man
  103. # 行首的代表标志为 ^ ,这个我们留待下节介绍!先有概念即可!
  104. 范例二:承上,如果我想要将所有的符号都列出来?(用 cat)
  105. [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 |cat -A
  106. MANPATH^I/usr/man$
  107. MANPATH^I/usr/share/man$
  108. MANPATH^I/usr/local/man$
  109. # 发现差别了吗?没错~ [tab] 按键可以被 cat -A 显示成为 ^I
  110. 范例三:承上,我将 [tab] 按键设定成 6 个字符的话?
  111. [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 | \
  112. > expand -t 6 - | cat -A
  113. MANPATH /usr/man$
  114. MANPATH /usr/share/man$
  115. MANPATH /usr/local/man$
  116. 123456123456123456.....
  117. # 仔细看一下上面的数字说明,因为我是以 6 个字符来代表一个 [tab] 的长度,所以,
  118. # MAN... 到 /usr 之间会隔 12 (两个 [tab]) 个字符喔!如果 tab 改成 9 的话,
  119. # 情况就又不同了!这里也不好理解~您可以多设定几个数字来查阅就晓得!
  120. expand 也是挺好玩的~他会自动将 [tab] 转成空格键~所以,以上面的例子来说, 使用 cat -A 就会查
  121. 不到 ^I 的字符啰~此外,因为 [tab] 最大的功能就是格式排列整齐! 我们转成空格键后,这个空格键
  122. 也会依据我们自己的定义来增加大小~ 所以,并不是一个 ^I 就会换成 8 个空白喔!这个地方要特别注
  123. 意的哩! 此外,您也可以参考一下 unexpand 这个将空白转成 [tab] 的指令功能啊! ^_^

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