通常この分野におけるワンライナー(one-liner)とは、パイプ(|)という機能を用いて複数のコマンドを1行にまとめたものを意味する。パイプの機能は、その左側に記述されたコマンドの実行結果を、右側に記述されたコマンドの入力として渡すことである。本稿で解説するのはbashコマンドプロンプトでの使用例だが、簡単な構成のワンライナーにせよ複雑な構成のワンライナーにせよ、これらはいずれも使い方次第で大いに役立つ存在なのだ。
例えば、カレントのディレクトリに何個のファイルが置かれているかを確認するには、下記のコマンドを実行すればいい。
ls | wc -l
これは最も簡単な部類に属すワンライナーのサンプルであって、状況によってはより複雑な記述をすることになる。例えば、手元のシステムにて実行中のプロセスのうちでCPU時間を最大限に消費しているもの上位5つを特定するには、下記のコマンドを実行すればいい。
ps -eo user,pcpu,pid,cmd | sort -r -k2 | head -6
このうちpsコマンドの次にあるoは、表示対象とする列の指定用オプションである。その次のsort -rではk2という指定により、2行目の列(pcpu)を基にした逆順のソートを施させている。その次のheadで行っているのは、ヘッダ行を含めた先頭6行のみを先のソート結果から取得するための指定である。なおsortはデフォルトで先頭列をソート対象とするので、pcpuの指定位置を1番目とするようサンプルコードの記述を変更するとk2オプションは省略できる。つまり同じ処理をするワンライナーであっても、その記述法は複数存在するのであり、逆に記述法や用いるオプションを変更することで、異なる実行結果が得られることもある。
複数のユーザが利用するLinuxサーバを管理する場合、整理されたユーザのリストを手早く入手できると便利なはずだ。下記のコマンドもそうした用途で用いるワンライナーの1つである。
cat /etc/passwd | sort
ただしユーザ名だけが必要という場合、この指定では余分な情報も多数出力されてしまう。その点を改良したのが下記のワンライナーだ。
cat /etc/passwd | sort | cut -d":" -f1
これはソート後の情報をcutにて処理するよう変更したもので、その部分にあるdはフィールド間の区切り記号を指定するためのオプションだ。つまりcutの役割は各行における区切り部にてフィールドを分割することであり、ここでは1番目のフィールドが必要なので、それをf1という指定にて抽出させているのである。これにより“ユーザ名だけが必要”という要望は一応かなえられることになるが、問題はシステムのユーザ名として、apache、bin、lpなども混在してくることだ。これを人間のユーザだけに絞り込むには、下記のような指定をすればいい。
cat /etc/passwd | sort | gawk '$3 >= 500 {print $1 }' FS=":"
ここで追加したgawkは、パイプ経由で渡された情報を行単位で評価するためのコマンドだ。このサンプルでは、3番目のフィールドであるUID値が500以上の場合に限って(最近のディストリビューションでは、この番号以降のID値が通常のユーザに割り当てられる)後続のアクションを行うという指定が施されている。この場合の後続のアクションとは中カッコで示された部分で、具体的にはユーザ名である1番目のフィールドを表示させるという処理だ。なおgawkコマンドにフィールド区切りと認識させる記号はFSオプションにて指定するようになっており、ここではコロンを指定している。
