join 用于找出两个档案中, 指定栏位内容相同的行, 并加以合并, 再输出到标准输出装置.
语法:
join [options] [file1] [file2]
引数:
-a<1/2> : 除了显示原来的输出内容之外, 还显示指令档案中没有相同栏位的行;
-e<字串> : 若 file1 与 file2 中找不到指定的栏位, 则在输出中填入选项中的字串;
-i/–igore-case : 比较栏位内容时, 忽略大小写的差异;
-o<格式> : 按照指定的格式来显示结果;
-t<字元> : 使用栏位的分隔字元;
-v<1/2> : 跟-a 相同, 但是只显示档案中没有相同栏位的行;
-1<栏位> : 连线 file1 指定的栏位;
-2<栏位> : 连线 file2 指定的栏位;
<1>用 root 身份将/etc/passwd /etc/shadow 相关资料整合成一列
# join -t ‘:’ /etc/passwd /etc/shadow | head -3
root:x:0:0:root:/root:/bin/bash:$6$hOA3C.gi$hmyBAktEkjBhL7jNLj1p5ifJwysguv7YBd1eAKialhjnj/KWOwQL/RdJWGti3FGrNu0.G0GAMRuxj5pxU/anR.:16881:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:15628:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15628:0:99999:7:::
由输出的资料可以发现两个档案的最左边栏位都是账号, 且以”:” 分隔.
通过上面的这个操作, 可以将两个档案中的第一个栏位相同者整合成一行.
第二个档案对的相同栏位并不会显示 (因为在第一行了).
<2> /etc/passwd 的第四段是 GID, 而在/etc/group 当中是第三段, 那我们又如何能将这两个档案整合成一行呢?
# join -t ‘:’ -1 4 /etc/passwd -2 3 /etc/group | head -3
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:bin,daemon
同样, 相同的栏位部分被移动到最前面了, 所以第二个档案的内容就不显示了.
<3>使用-a/-v 显示不匹配行
# cat 01.txt
1 aa
2 bb
3 cc
# cat 02.txt
1 11
2 22
4 33
使用-a 选项, 显示 01.txt/02.txt 中不匹配的行,
# join -a 1 01.txt 02.txt
1 aa 11
2 bb 22
3 cc
# join -a 2 01.txt 02.txt
1 aa 11
2 bb 22
4 33
而使用-v 选项, 只显示 01.txt/02.txt 中不匹配的行,
# join -v 1 01.txt 02.txt
3 cc
# join -v 2 01.txt 02.txt
4 33
<4>使用-o, 指定格式来显示档案
# join -o 1.2 2.2 01.txt 02.txt
aa 11
bb 22
通过上面操作, 来显示第一个档案的第二个域, 第二个档案的第二个域.