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
通過上面操作, 來顯示第一個檔案的第二個域, 第二個檔案的第二個域.