(Linux)何に使うかわからないrevを使って並び替えとニブルスワップ

6-2.並び替え

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の使い道を見い出せるかもしれません。

コメント

タイトルとURLをコピーしました