字符串转换命令:tr,col,join,paste,expand

DOS断行字符与Unix断行字符不同,并且可以用dos2unix与unix2dos来完成转换。那么是否还有其他常用的字符替代?如,要将大写改为小写,或者将数据中的[tab]按键转换成空格键?还有,如何将两篇文档整合成一篇?

tr

tr可以用来删除一段文档中的文字,或者进行文字的替换!

tr [-ds] SET1 ...
选项与参数:
-d:删除讯息中的SET1这个字符串;
-s:取代重复的字符!

example1:
将last输出的讯息中,所有的小写变成大写字符:
debian@debian-pc:~$ last | tr '[a-z]' '[A-Z]'
DEBIAN   :0           :0               WED APR 13 19:45   STILL LOGGED IN
REBOOT   SYSTEM BOOT  4.2.0-1-AMD64    THU APR 14 03:44   STILL RUNNING
DEBIAN   :0           :0               SAT APR  9 21:01 - DOWN  (3+22:42)
REBOOT   SYSTEM BOOT  4.2.0-1-AMD64    SUN APR 10 05:00 - 19:43 (3+14:42)

WTMP BEGINS SUN APR 10 05:00:51 2016

example2:
将/etc/passwd输出的讯息中,将冒号删除。
debian@debian-pc:~$ cat /etc/passwd | tr -d ':'

example3:
将/etc/passwd转换成dos断行到/root/passwd中,再将^M符号删除。
debian@debian-pc:~$ sudo cp /etc/passwd /root/passwd
&& unix2dos /root/passwd
debian@debian-pc:~$ sudo file /etc/passwd /root/passwd
/etc/passwd:  ASCII text
/root/passwd: ASCII text, with CRLF line terminators  < == 就是DOS断行
debian@debian-pc:~$ sudo cat /root/passwd  | tr -d '\r' > /root/passwd.linux
#那个\r指的是DOS的断行字符。

col

col [-xb]
选项与参数:
-x:将tab键转换成对等的空格键
-b:在文字中有反斜杠(/)时,仅保留反斜杠后面接的那个字符

虽然col也有其他用途,很多时候用来处理将[tab]按键取代为空格键。

join

join字面可知为“加入/参加”,处理两个档案之间的数据。而且,主要处理两个档案有“相同数据”的那一行,将他们加在一起。

join [-ti12] file1 file2
选项与参数:
-t:join默认以空格符分隔数据,并且比对【第一个字段】的数据,如果两个档案相同,则将两笔数据连成一行,且第一个字段放在第一个。
-i:忽略大小写差异;
-1:数字1,代表第一个档案要用那个字段来分析的意思。
-2:代表第二个档案要用那个字段来分析的意思。
example1:
用root身份,将/etc/passwd与/etc/shadow相关数据整合成一栏。
debian@debian-pc:~$ sudo head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

==> /etc/shadow <==
root:*:16791:0:99999:7:::
daemon:*:16791:0:99999:7:::
bin:*:16791:0:99999:7:::
#由输出的资料可以发现这两个档案最左边都是账号,且以:分隔。
debian@debian-pc:~$ sudo join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:*:16791:0:99999:7:::
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin:*:16791:0:99999:7:::
bin:x:2:2:bin:/bin:/usr/sbin/nologin:*:16791:0:99999:7:::
#通过上面动作,我们将两个档案第一字段相同者整个成一行!第二个档案相同字段不会显示。

example2:
我们知道/etc/passwd的第四个字段是GID,那个GID记录在/etc/group当中第三个字段,请将两个档案组合。
debian@debian-pc:~$ head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

==> /etc/group <==
root:x:0:
daemon:x:1:
bin:x:2:
debian@debian-pc:~$ join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
1:daemon:x:1:daemon:/usr/sbin:/usr/sbin/nologin:daemon:x:
2:bin:x:2:bin:/bin:/usr/sbin/nologin:bin:x:
#同样,相同的字段被移动至最前面了,所以第二个档案的内容就没再显示。

这个join在处理两个相关数据文件时,很有帮助。例如上面,我的/etc/passwd,/etc/shadow,/etc/group都有相关性,其中/etc/passwd,/etc/shadow以账号为相关性,至于/etc/shadow,/etc/group则以GID来作为相关性。根据这个相关性,可以将有关系的资料放在一起。
此外,需要注意,使用join之前,需要处理的档案应先经过排序(sort)处理!否则有些比对的项目会被忽略。

paste

这个paste比join简单多了,相对于join必须要比对两个档案的相关性,paste就直接将两行贴在一起,且中间以[tab]键隔开。

paste [-d] file1 file2
选项与参数:
-d:后面可以接分隔字符。预设[tab]来分隔。
-:如果file部分写成-,表示来自standard input的资料的意思。
example1:
将/etc/passwd与/etc/shadow同一行贴在一起
debian@debian-pc:~$ sudo paste /etc/passwd /etc/shadow
[sudo] debian 的密码:
root:x:0:0:root:/root:/bin/bash root:*:16791:0:99999:7:::
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:*:16791:0:99999:7:::
bin:x:2:2:bin:/bin:/usr/sbin/nologin    bin:*:16791:0:99999:7:::
sys:x:3:3:sys:/dev:/usr/sbin/nologin    sys:*:16791:0:99999:7:::
#注意,同一行是以[tab]按键隔开的!

example2:
先将/etc/group读出,然后与example1贴在一起,且仅取出前三行。
debian@debian-pc:~$ cat /etc/group |sudo  paste /etc/passwd /etc/shadow -| head -n 3
root:x:0:0:root:/root:/bin/bash root:*:16791:0:99999:7:::   root:x:0:
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:*:16791:0:99999:7::: daemon:x:1:
bin:x:2:2:bin:/bin:/usr/sbin/nologin    bin:*:16791:0:99999:7:::    bin:x:2:

expand

将[tab]键转成空格键。

expand [-t] file
选项与参数:
-t:后面可以接数字。一般一个tab键可以用8个空格键取代。我们也可以自定义一个[tab]按键代表几个字符。

example1:
debian@debian-pc:~$ grep '^MANPATH' /etc/manpath.config | head -n 3
MANPATH_MAP /bin            /usr/share/man
MANPATH_MAP /usr/bin        /usr/share/man
MANPATH_MAP /sbin           /usr/share/man
debian@debian-pc:~$ grep '^MANPATH' /etc/manpath.config | head -n 3 |expand -t 1 -
MANPATH_MAP /bin   /usr/share/man
MANPATH_MAP /usr/bin  /usr/share/man
MANPATH_MAP /sbin   /usr/share/man
expand也是挺好玩,他会自动将[tab]转成空格键。所以,上面的例子来说,使用cat -A就会看不到^I的字符。此外,因为[tab]最大功能就是格式排列整齐。我们转成空格后,这个空格键也会依据我们自定义来增加大小。所以一个^I就会换成8个空白。这个地方要特别注意。此外,可以参考unexpand这个将空白转成[tab]的指令功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值