Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151071
  • 博文数量: 55
  • 博客积分: 2409
  • 博客等级: 大尉
  • 技术积分: 371
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-10 14:19
文章分类

全部博文(55)

文章存档

2012年(5)

2011年(15)

2010年(6)

2009年(29)

我的朋友

分类: LINUX

2009-11-17 11:22:14

join看字面上的意义(加入/参加)就可以知道,他是在处理量个档案之间的数据,而且,主要是在处理【两个档案当中,有“相同数据”的那一行,将他们加在一起】的意思。我们利用底下的简单例子来说明:
join --help
用法:join [选项]... 文件1 文件2
针对每一对具有相同内容的输入行,整合为一行写到标准输出,
默认的内容连接区块是由第一个空白符代表的分界符号。当文件1
或文件2 都被指定为"-"时,程序将从标准输入读取数据。
  -a  文件编号          文件编号的值可以是1 或2,分别对应文件1 和 文件2。
                        此选项用于根据指定文件编号输出不成对的行目。
  -e 字符               将缺失的输入区块替换为指定字符
  -i, --ignore-case     比较时忽略大小写
  -j 域                 等于"-1 域 -2 域"
  -o 格式               按照指定格式构造输出行
  -t 字符               使用指定字符作为输入和输出的分隔符
  -v 文件编号           类似 -a 文件编号,但禁止组合输出行
  -1 域                 在文件1 的此域组合
  -2 域                 在文件2 的此域组合
  --check-order         检查输入行是否正确排序,即使所有输入行均是成对的
  --nocheck-order       不检查输入是否正确排序
      --help     显示此帮助信息并退出
      --version  输出版本信息并退出
除非使用了"-t 字符串" 选项,否则前导空格分隔的域将被忽略,如果指定了字符串,
则使用指定字符串分隔任意的域并从1 开始计数的域编号。可以指定的格式是由一个
或多个逗号活空格所分隔的描述,其形式为"文件编号.域"或者"0"。默认的
格式输出合并后的域、文件1 和文件2 剩下的域,均由该指定字符串分隔。
重要提示:文件1 和文件2 必须在合并域中排序。
例如,如果"join"后没有选项,使用"sort -k 1b,1"。
注意,所进行的比较遵从"LC_COLLATE"所指定的的规则。
如果输入没有被排序并导致某些行无法合并,将会显示警告信息。
 
范例:
 
 
范例一:用root的身份,将/etc/passwd与/etc/shadow相关数据整合成一栏
sudo join -t ':' /etc/passwd /etc/shadow
[sudo] password for yekeqiang:
root:x:0:0:root:/root:/bin/bash:!:14535:0:99999:7:::
daemon:x:1:1:daemon:/usr/sbin:/bin/sh:*:14354:0:99999:7:::
bin:x:2:2:bin:/bin:/bin/sh:*:14354:0:99999:7:::
sys:x:3:3:sys:/dev:/bin/sh:*:14354:0:99999:7:::
sync:x:4:65534:sync:/bin:/bin/sync:*:14354:0:99999:7:::
。。。。。。。。
#因为/etc/shadow的权限问题,所以这里必须是root才能动作,而/etc/passwd和/etc/shadow都是
#以 : 来分隔字段,所以必须要用-t ':' 规范字段分隔字符
#且因为/etc/shadow与/etc/passwd刚好都是以第一个字段为账号名称,所以
#就可以将同一行的数据给他贴在一起了;另外再仔细看一下/etc/shadow的内容与/etc/passwd的内容
#你会发现两者都以账号为开始,而上面的输出数据中你会发现特殊的字体部分,那就是你的第二个档案的内
#容。在第二个档案的内容部分,由于账号(第一个字段)与第一的当地是相同的,所以当然的省略掉,因此 #成为上面的输出
 
范例二:我们知道/etc/passwd第四个字段是GID,那个GID记录在/etc/group当中的第三个字段,请问如何将两个档案整合?我们可以用下面的命令列:
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:/bin/sh:daemon:x:
2:bin:x:2:bin:/bin:/bin/sh:bin:x:
3:sys:x:3:sys:/dev:/bin/sh:sys:x:
 
# 这个例子就更明显了!原本的/etc/passwd的第一行内容应该是:
# root:x:0:0:root:/root:/bin/bash
# 至于/etc/group第一行内容应该是:
# root:x:0:
# 我们将第一个档案的第四栏和第二个档案的第三栏取出,放置到输出的最前方,然后将剩下的书籍给他们
# 加在一起,就成了上面的输出啦!
 
这个join在处理两个相关的数据文件时,就真的很有帮助的,例如上面的案例中,我的/etc/passwd,/etc/shadow/,/etc/group都是有相关性的,其中的etc/passwd与/etc/shadow/以账号为相关性,至于/etc/shadow/与/etc/group则以所谓的GID(账号的数字定义)来作为他的相关性。我们可以将有关系的资料放在一起,这样的话,在处理数据会对我们帮助很大。
 
 
阅读(1355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~