revは、テキストを左右逆にするコマンドですが、使い道がわからないコマンドの一つです。(基本的には右から左に書く言語用だとは思いますが)
まずは本来の目的である文字列左右反転の使い方を確認してみます。
takk~$ echo abcde | rev edcba takk~$
このようにテキストを逆に表示してくれるだけですが、なんと日本語も認識して逆にしてくれます。
takk~$ echo あいおえお | rev おえういあ
テキストを認識するということは、改行コードが発見されるデータまで、つまり一行毎の反転になりますので、もちろんバイナリには使えません。加えて、日本語が使えるということは、一文字が複数バイトで構成されますので、1バイト単位で反転するわけではないということです。必ず文字を構成するバイト単位で反転します。
文字コード入りのバイナリデータを作成して確認してみます。
takk~$ echo -ne "\x01\x02\x03\xe3\x81\x82\x00\x00\x00" > a.bin takk~$ od -tx1 a.bin 0000000 01 02 03 e3 81 82 00 00 00 0000011 takk~$ rev < a.bin > b.bin takk~$ od -tx1 b.bin 0000000 e3 81 82 03 02 01 0000006 takk~$
文字コードに当たるe3 81 82の順序は逆にならず、01 02 03のみ逆になっています。また、00が削除されたのでデータサイズ自体が変わってしまいました。サイズが変わってしまっては反転したことにはなりません。このようにrevコマンドはバイナリ処理では使えず、テキストで使うことが前提となっています。
では、テキスト処理にて左右反転以外に、revコマンドにどのような利用ケースがあるでしょうか。
以下は、特殊な並び替えをする場合にrevを利用した例です。
takk~$ ls -1 test1.1 test1.2 test1.txt test2.1 test2.2 test2.txt test3.1 test3.2 test3.txt takk~$ takk~$ ls | rev | sort | rev test1.1 test2.1 test3.1 test1.2 test2.2 test3.2 test1.txt test2.txt test3.txt takk~$
ファイルのリストを拡張子で並び替えしました。
sortはデフォルトで先頭文字から並び替えを行います。revでファイル名を左右反転させることにより、sortによる並び替えの対象をファイル名の末尾文字からに変更しました。
ただし、lsでも同様のことはできます。-Xは拡張子でソートするオプションです。
takk~$ ls -X test1.1 test2.1 test3.1 test1.2 test2.2 test3.2 test1.txt test2.txt test3.txt takk~$
ls以外のコマンド、例えばfindの出力結果を拡張子sortする分にはrevは役立つかもしれません。
takk~$ find -type f | rev | sort | rev ./test1.1 ./test2.1 ./test3.1 ./test1.2 ./test2.2 ./test3.2 ./test1.txt ./test2.txt ./test3.txt takk~$
次のケースは、revコマンドをhexdumpやperlと併用し、4bit(ニブル=nibble)スワップする例です。
takk~$ echo -ne '\x01\x02\x03\x81\x82\xF1\xF2\xF3' > a.bin takk~$ hexdump -ve '/1 "%02x\n"' a.bin | rev | perl -ne 'print chr hex' > b.bin takk~$ od -tx1 a.bin 0000000 01 02 03 81 82 f1 f2 f3 0000010 takk~$ od -tx1 b.bin 0000000 10 20 30 18 28 1f 2f 3f 0000010 takk~$
UNIX(Linux)コマンドは文字数が少ないコマンドほど重要なコマンドらしいですが、revは3文字と短いのにもかかわらず、世間では使用頻度が低い気がします。
並び替えやニブルスワップの例のように本来の使い方ではなくとも、まだまだ探せばrevの使い道を見い出せるかもしれません。
コメント