Skip to content

字符转换命令

1. tr

参考:Windows、Mac与Unix的换行符与编码转换

2. col

col [options]

OPTIONS
    -x, --spaces            convert tabs to spaces
    -h, --tabs             convert spaces to tabs
[sink@dev vitest]$ cat man_db.conf | col -x | cat -A

3. join

join [OPTION]... FILE1 FILE2
将两个文件合并
OPTION
    -i, --ignore-case  忽略大小写
    -t CHAR           指定输入输出的分隔符(默认是空格)
    -1 FIELD          根据 file 1 的这个域来合并
    -2 FIELD          根据 file 2 的这个域来合并
    -j FIELD          equivalent to '-1 FIELD -2 FIELD'
[root@dev vitest]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$6$dEmXqJj8IH07TF97$sD08U6KQTP.Y.2Wr.Fe27m.b7Hq4M0LjIgeNoLI5GYU1e/qvaT/bxWxgF5F8tz5O.Zd4KayZfvnBae/hV2QbA1::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
[root@dev vitest]# join -t ':' /etc/passwd /etc/shadow | head -n 3
root:x:0:0:root:/root:/bin/bash:$6$dEmXqJj8IH07TF97$sD08U6KQTP.Y.2Wr.Fe27m.b7Hq4M0LjIgeNoLI5GYU1e/qvaT/bxWxgF5F8tz5O.Zd4KayZfvnBae/hV2QbA1::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17110:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17110:0:99999:7:::

[root@dev vitest]# head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/group <==
root:x:0:
bin:x:1:
daemon:x:2:
[root@dev vitest]# join -t ':' -j 3 /etc/passwd /etc/group | head -n 3
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:

Note

在使用 join 之前, 你所需要处理的文件应该要事先经过排序(sort)处理!否则有些比对的项目会被略过。

4. paste

paste [OPTION]... [FILE]...
单纯地将多个文件的行合并起来

-d, --delimiters=LIST   指定分隔符,默认是 TABs
-s                      一次粘贴一个文件,而不是并行粘贴
-                       从标准输入读取
[root@dev vitest]# cat /etc/passwd | paste /etc/shadow /etc/group - | head -n 3
root:$6$dEmXqJj8IH07TF97$sD08U6KQTP.Y.2Wr.Fe27m.b7Hq4M0LjIgeNoLI5GYU1e/qvaT/bxWxgF5F8tz5O.Zd4KayZfvnBae/hV2QbA1::0:99999:7:::   root:x:0:       root:x:0:0:root:/root:/bin/bash
bin:*:17110:0:99999:7:::        bin:x:1:        bin:x:1:1:bin:/bin:/sbin/nologin
daemon:*:17110:0:99999:7:::     daemon:x:2:     daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@dev vitest]# head num1 num2
==> num1 <==
1
2
3

==> num2 <==
4
5
6
[root@dev vitest]# paste num1 num2
1       4
2       5
3       6
[root@dev vitest]# paste -s num1 num2
1       2       3
4       5       6

5. expand

expand [OPTION]... [FILE]...
把每个文件中的 tabs 转为空格

-t, --tabs=NUMBER   指定空格的长度,默认是 8
-                   从标准输入读取
[root@dev vitest]# cat -A num1; expand num1 | cat -A
1^I1.1$
2^I2.2$
3^I3.3$
1       1.1$
2       2.2$
3       3.3$

与之相反的是unexpand指令

# 有点奇怪,明明只有4个空格,却要使用5来指定宽度???
[root@dev vitest]# cat -A num2; echo '---------'; unexpand -t 5 num2 | cat -A
4    4.4$
5    5.5$
6    6.6$
---------
4^I4.4$
5^I5.5$
6^I6.6$