6月 05

seqコマンドのゼロサプレスなし(ゼロ抑制なし=先頭に0を付ける)のやり方を度々忘れるので備忘録として書いておく。

まず普通にseq。(便宜上INCREMENT=50にしてる)

$ seq 1 50 101
1
51
101

桁合わせに0を入れたいなら単純に-wオプションでOK。

$ seq -w 1 50 101
001
051
101

seqコマンドには-fというprintfと同様の書式が使えるオプションが用意されているのでこれを使う手もある。ただしオプション説明に“use printf style floating-point FORMAT”とあるのであくまでも浮動小数関連フォーマット指定になる。つまり%02gはOKだけど%02dはダメ。

ゼロサプレスなしの最低二桁。

$ seq -f %02g 1 50 101
01
51
101

ゼロサプレスなしの三桁。

$ seq -f %03g 1 50 101
001
051
101

ゼロサプレスなしの四桁。

$ seq -f %04g 1 50 101
0001
0051
0101

5月 31

cygwinでテキストファイルの改行コードを変更するときは、unix2dos, unix2mac, dos2unix, mac2unix コマンドを使うと簡単にできます。-hオプション付けると詳細な使い方が表示されますが、ほとんどの場合は引数に変換対象ファイル名を指定すれば事足りると思います。

・元のファイルはUnix改行コード。(LF)
$ file sample.txt
sample.txt: ASCII text

・Windows,DOS改行コードに変換。(CRLF)
$ unix2dos sample.txt
unix2dos: converting file sample.txt to DOS format …
$ file sample.txt
sample.txt: ASCII text, with CRLF line terminators

・Mac改行コードに変換。(CR)
$ unix2mac sample.txt
unix2mac: converting file sample.txt to Mac format …
$ file sample.txt
sample.txt: ASCII text, with CR line terminators

3月 01

REGZA 37Z9000 の外付けHDD(ベアドライブ・SATA-USB変換ケーブルで接続)が突然認識しなくなりました。いや、認識しなくなったというか、USBを接続し直すと新しいHDDとして再登録&フォーマットを要求されるようになってしまった。こうなる直前は録画番組が再生できたりできなかったりという不安定な状態でした。

録画済み番組が大量にあるのでなんとか復旧させようといろいろ調べたらレグザHDD復旧ソフト「REGZA HDD Easy Repair」(またはここ)なるものを公開してる人がいたので試したら直った!GJ!

復旧手順はリンク先に書いてあるので省略。ちなみに私は Xubuntu 11.10 (32bit) を使いました。一度64bit版で試したら復旧ツールのインストールができませんでした。また、LAN接続してないとインストールできなかったような気がしますが何かの間違いかもしれません。

復旧後は問題なく使えてます。

6月 03

Macのlessコマンドでcompressやgzip圧縮されたテキストファイルを自動展開して閲覧できるようにするやりかた。(Macに限った話ではないですけどね…)
1. lesspipe.shファイルをどこかに作成する。

#!/bin/sh
case "$1" in
*.Z) uncompress -c $1 2>/dev/null ;;
*.gz) gzip -dc $1 2>/dev/null ;;
*.bz2) bzip2 -dc $1 2>/dev/null ;;
esac

2. lesspipe.shに実行権限を付与。

chmod +x lesspipe.sh

3. LESSOPEN環境変数を以下のように設定。lesspipe.shのパスは環境に合わせて変更すること。

export LESSOPEN="|~/Documents/shells/lesspipe.sh %s"

以上で、less readme.txt.gz などとすれば拡張子にあわせて自動的に展開してくれるようになります。詳しいことはlessのオンラインマニュアル(man less)を参照。
ターミナル起動するたびに有効にしたいときは.bashrcにexport LESSOPEN…行を書いておけばいいのですが、Macだと多分.bashrcも.bash_profileもないでしょうからそれぞれ以下のように設定しておいてください。
~/.bashrc

export LESSOPEN="|~/Documents/shells/lesspipe.sh %s"

~/.bash_profile

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

1月 16

昔はUnixコマンドの-hオプションといえばヘルプだったような気がするのですが、今はhuman readableな出力処理が割り当てられているコマンドが結構あります。以下はlsコマンドのオンラインマニュアルからの引用。関連オプション--siも一緒に引用。

-h, --human-readable
with -l, print sizes in human readable format (e.g., 1K 234M 2G)
--si   likewise, but use powers of 1000 not 1024

つまり人間が見てわかりやすいようにキロバイトならK、メガバイトならMを付けた形で表示してくれるということです。--siは国際単位系に合わせて基数1000で表示します。(付けなければ基数1024)

実行結果は以下のとおり。

$ ls -l
total 2128
-rw-r--r-- 1 foo  foo        1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo     1000 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo     1024 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  1000000 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1048576 2010-01-16 09:40 test.1MiB

$ ls -lh
total 2.1M
-rw-r--r-- 1 foo  foo     1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo  1000 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo  1.0K 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  977K 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1.0M 2010-01-16 09:40 test.1MiB

$ ls -lh --si
total 2.2M
-rw-r--r-- 1 foo  foo     1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo  1.0k 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo  1.1k 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  1.0M 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1.1M 2010-01-16 09:40 test.1MiB

わかりやすくていいですね。ls以外でもdfやduなどで使えます。

1月 13

UnixやLinuxのようなCUI画面ではコマンドの実行結果が次の行に表示されますが、同じコマンドを連続実行するときは実行結果を同じ位置に表示し続けるほうが見やすい場合もあります。そんなときに使えるのがwatchコマンドです。watchコマンドは引数で指定したコマンドを定期的に実行してフルスクリーンで表示してくれます。

watch date

日本語が通らないようなのでLANG=Cでデフォルトロケールにしたほうがよいかもしれません。

LANG=C watch date

コマンド実行インターバルは-nオプションで指定。デフォルトは2秒なので、1秒間隔で実行したいときはこうします。

watch -n 1 date

-dオプションを付けると更新箇所をハイライトしてくれます。

watch -n 1 -d date

watchコマンドはLinuxならたぶん使えます。他のOSはわかりません。どなたかがportingしたものがどこかに落ちてるかもしれません。FreeBSDのwatchコマンドはttyの監視という全く別のコマンドなので気をつけましょう。watchコマンドがないときはこんなやりかたもあります。

while true; do clear; LANG=C date; sleep 1; done

1月 05

テストデータとして固定長ファイルを作成するときはddコマンドを使うと簡単に作れます。1MBの空のファイル(全データnull文字)を作成する方法は以下のとおり。

dd if=/dev/zero of=zero1MB1.dat count=1024 bs=1024
dd if=/dev/zero of=zero1MB2.dat count=1024 bs=1K
dd if=/dev/zero of=zero1MB3.dat count=1 bs=1M

ifはデータ入力元、ofはデータ出力先、bsは1回当たりの処理量をバイトで指定、countは処理の回数。なので、上の3つのコマンドの生成ファイルは全て空の1MBのファイルになります。

1MBのランダムファイル(データは乱数)を作成する方法は以下のとおり。

dd if=/dev/urandom of=urandom1MB.dat count=1024 bs=1024

forとかseqコマンドと組み合わせると複数ファイルの生成を自動化できます。

for i in `seq 0 9`
do
dd if=/dev/urandom of=urandom1MB$i.dat count=1024 bs=1K
done

これでurandom1MB0.datからurandom1MB9.datまでの10個の固定長乱数ファイルを一気に作れます。注意点ですが、ddのofで上書き可能なファイルが指定されたとき、ddは容赦なく上書きするので気をつけましょう。

preload preload preload