grep(1)しない話

もう1つ、初級小ネタ。

DebianUbuntuで、あるパッケージがインストールされているか否か調べるのに、今までdpkg(1)とgrep(1)を組み合わせていた。

dpkg -l | grep acpi

ところで先日、dpkg(1)のmanを見たところ:

-l, --list package-name-pattern...

package-name-pattern」という怪しい文言が……。

dpkg --help」の内容も:

-l|--list [<pattern> ...]

pattern」! 実に怪しいな。

dpkg-query(1)のmanに:

Normal shell wildchars are allowed in package-name-pattern.

――と書かれていたので、*?[...]といった一般的なワイルドカードが使えるようだ。

dpkg -l 'acpi*'     # acpiで始まるパッケージを探す
dpkg -l '?awk'      # awkで終わる4文字のパッケージを探す
dpkg -l '[gm]awk'   # gawkかmawkを探す

ということで、grep(1)で引っかけたい対象がパッケージ名である場合に限り、シェルのパス名展開と同じワイルドカードでパターンを書けば、grep(1)が不要だと分かった。

もう「お前、何年Debianディストリビューション触ってんだよ!」的な事案である。Ubuntuとは8.04の頃からの付き合いだし、Debianも6.0が出る直前ぐらいから実験用に最小構成インストールの仮想マシンを使ったりしていたのに、この体たらくである。

やっぱりmanを読まないとアカンなあ……しかしLinux(ないしPC-Unix)を常用していない兼業状態なので、安直にネットで拾った情報に頼ってしまう。どうしたものか。

cat(1)しない話

初級小ネタ。

例えばgrep(1)する際に、こんな感じのサンプルコードが示されることがある。

cat file.txt | grep foo

しかし個人的には次のほうが好みだ。

grep foo file.txt

せっかく引数でファイルを指定できるのだから、そちらを使いたい気分になるのだ。

tr(1)のように標準入力しか受け付けないコマンドや、wc(1)のようにファイルか標準入力かで出力が変化するコマンド(で、標準入力の場合の挙動の方が望ましいケース)では、リダイレクトを使う書き方をする。

tr [abc] [ABC] <file.txt
wc -l <file.txt

わざわざcat(1)を使ってテキストフィルタに流し込むのは、複数のファイルを連結した結果に対して何かを行いたい場合ぐらいだが、機会は少ない。