linux join命令


join处理两个文件之间的数据,主要是在处理两个文件当中,有相同数据的那一行,才将他加join在一起
[peter@study ~]$ join [-ti12] file1 file2
选项与参数:
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的1 ,代表第一个文件要用那个字段来分析的意思;
-2 :代表第二个文件要用那个字段来分析的意思。
用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@initroot ~]# 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:$6$iWZdx1dL$UmMmRTYcPPYmIOLphHouLkfqbsy2k4uyLnekclB4LnBP9ksLDGCqZ5kTS/uxsl7D4umb1/.RrEJF/Xw0lDlDu/:18268:0:99999:7:::
daemon:*:17882:0:99999:7:::
bin:*:17882:0:99999:7:::

从上面的输出可以看出这两个文件的最左边字段都是相同账号!且以 : 分隔
[root@initroot ~]# join -t ':' /etc/passwd /etc/shadow | head -n 3
root:x:0:0:root:/root:/bin/bash:$6$iWZdx1dL$UmMmRTYcPPYmIOLphHouLkfqbsy2k4uyLnekclB4LnBP9ksLDGCqZ5kTS/uxsl7D4umb1/.RrEJF/Xw0lDlDu/:18268:0:99999:7:::
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin:*:17882:0:99999:7:::
bin:x:2:2:bin:/bin:/usr/sbin/nologin:*:17882:0:99999:7:::
这样我们就可以将两个文件第一字段相同者整合成一行!第二个文件的相同字段并不会显示(因为已经在最左边的字段出现了啊!)
我们知道/etc/passwd第四个字段是GID ,那个GID记录在/etc/group文件中的第三个字段,请问如何将两个文件整合?
[root@initroot ~]# 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:peter
daemon:x:1:
bin:x:2:

从上面可以看到,确实有相同的部分喔!赶紧来整合一下!
[root@initroot ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n 3
join: /etc/passwd:6: is not sorted: games:x:5:60:games:/usr/games:/usr/sbin/nologin
join: /etc/group:11: is not sorted: uucp:x:10:
0:root:x:0:root:/root:/bin/bash:root:x:peter
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/passwd, /etc/group则以所谓的GID(账号的数字定义) 来作为他的相关性。 根据这个相关性,我们可以将有关系的资料放置在一起!这在处理数据可是相当有帮助的! 但是上面的例子有点难,希望您可以静下心好好的看一看原因喔!此外,需要特别注意的是,在使用 join 之前,你所需要处理的文件应该要事先经过排序 (sort) 处理!
否则有些比对的项目会被略过呢!特别注意了!

本文由initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读