Category Archives: 6-1.比較・差分

uniqで片方のファイルにしか存在しない文字列を見つける


アニメ『紅殻のパンドラ』(2016)
脳は人間で体が機械、いわゆるサイボーグです。体はソフトウェアで制御されているみたいなので、当然バージョンアップとかもありますね。
将来、体に機械を組み込むような世の中になると、バグが心配です。まあ、バグがなくても、バージョン違いで動かないってことは多々あるので、バージョンの確認はとても大事ですね。
コマンド使いも、普段から使うコマンドのバージョンは意識しておくべきかなあと思います。

ではlsコマンドのバージョンを確認してみます。

takk@deb8:~$ ls --version
ls (GNU coreutils) 8.23
Copyright (C) 2014 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Richard M. Stallman および David MacKenzie。
takk@deb8:~$ 

たいていのコマンドは、このlsコマンドのように-(ハイフン)2つのロングオプション–versionを指定すれば確認できます。

/bin配下にあるコマンドのバージョン一覧を作るスクリプトを書いてみましょう。

takk@deb8:~/tmp$ cat version.sh
for i in `ls /bin`;do 
$i --version 1>/dev/null 2>&1
if [ $? -eq 0 ];then
	$i --version 2>&1 | grep ^$i'.*[0-9]\.'
else
	echo $i noversion
fi
done
takk@deb8:~/tmp$ 

–versionでコマンドが成功した場合は、バージョン行を表示し、
失敗した場合は、コマンド名とnoversionと表示するスクリプトです。

実行結果は、listというファイルに格納しました。

takk@deb8:~/tmp$ . version.sh > list
takk@deb8:~/tmp$ 

確認してみましょう。

takk@deb8:~/tmp$ head list
busybox noversion
bzcmp noversion
bzdiff noversion
bzegrep noversion
bzexe noversion
bzfgrep noversion
bzgrep noversion
bzip2, a block-sorting file compressor.  Version 1.0.6, 6-Sept-2010.
bzip2recover noversion
cat (GNU coreutils) 8.23
takk@deb8:~/tmp$ 

のっけからnoversionが続いてます。

–versionが成功するコマンドはいくつあるでしょう。

takk@deb8:~/tmp$ grep -v noversion list | wc -l
67
takk@deb8:~/tmp$ grep -v noversion list | head
bzip2, a block-sorting file compressor.  Version 1.0.6, 6-Sept-2010.
cat (GNU coreutils) 8.23
chgrp (GNU coreutils) 8.23
chmod (GNU coreutils) 8.23
chown (GNU coreutils) 8.23
cp (GNU coreutils) 8.23
cpio (GNU cpio) 2.11
date (GNU coreutils) 8.23
dd (coreutils) 8.23
df (GNU coreutils) 8.23
takk@deb8:~/tmp$ 

もしかしたらほぼcoreutilsかもしれませんね。

次は/bin配下のコマンド数と、listに格納されているコマンド数を比べてみましょう。

takk@deb8:~/tmp$ wc -l list
111 list
takk@deb8:~/tmp$ ls /bin | wc -l
152
takk@deb8:~/tmp$ 

ん〜。なぜでしょうか。一致しません。uniqでlistからこぼれているコマンド確認してみましょう。

takk@deb8:~/tmp$ (awk '{print $1}' list;ls /bin) | sort | uniq -u >nglist

タイトルにあるuniqで片方のみに存在する文字列を発見する方法を使ってみました。
diffと違うのは、いちいちファイルに保存しなくてもよいところです。保存が面倒でなかったらdiffで十分かと思います。

takk@deb8:~/tmp$ wc -l nglist
43 nglist
takk@deb8:~/tmp$ 

あれ。またまた数が合いません。152-111で41になるはずなのに、2個多いです。
ゴミでも入ってるのでしょうか。

数が少ないのですく見つかりましたが、bzip2のあとに,(カンマ)がついています。
bzip2とbzip2,を別の文字列と認識したようです。

bzip2, a block-sorting file

気を取り直して、,(カンマ)を空白に置換してリストを作って確認してみます。

takk@deb8:~/tmp$ (tr ',' ' ' < list | awk '{print $1}';ls /bin) | sort | uniq -u > nglist
takk@deb8:~/tmp$ wc -l nglist
41 nglist
takk@deb8:~/tmp$ 

41なので数はぴったり合います。
ではnglistのコマンドを確認してみましょう。

takk@deb8:~/tmp$ head nglist
bash
bunzip2
bzcat
bzless
bzmore
dnsdomainname
domainname
echo
egrep
fgrep
takk@deb8:~/tmp$ 

おかしいです。bash –versionはバージョン表示されるはずですが、nglistに上がっています。

続く。