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
通过上面操作,来显示第一个文件的第二个域,第二个文件的第二个域.