はじめに
この連載では、UNIX系OSをコマンドライン上から効率よく利用するために知っておくべきテクニックや、便利な小技を紹介していきます。
今回は、「定番のフィルタコマンドを使いこなす」ためのテクニックを紹介します。
今までの記事
対象読者
- UNIX系OSコマンドを一通り利用したことがある方
- 正規表現を利用したことがある方
- 何らかのプログラミング経験がある方
動作確認環境
- Linux(Debian etch/Fedora 9/CentOS 5.1)
- FreeBSD 6.1
- Cygwin 1.5.X
なるべくUNIX系OS一般に当てはまるよう解説するので、特に記述がない場合は、Mac OS X、Red Hat Linux上でも動作します。
シェルに関しては、bash(Bourne-Again Shell 2および3)を想定しています。
定番のフィルタコマンドを使いこなす
標準入力からデータを受け取り、その結果を標準出力に出力するコマンドを「フィルタコマンド」と呼びます。フィルタコマンドは、「|
(パイプ)」で繋げることで、ログの解析などさまざまな処理ができます。
今回は、定番のフィルタコマンド(cut
、paste
、sort
、uniq
、head
、tail
、wc
)のテクニックを説明します。
ファイル内文字列の分割
cutコマンド
cut
コマンドは、特定の文字で区切られた項目を分割します。利用方法は次のようになります。
$ cut [オプション] [ファイル名]
主なオプションは次のとおりです。
オプション | 説明 |
---|---|
-c | 切り出す文字数を指定する |
-d | 区切り文字を指定する(デフォルトはタブ) |
-f | 表示する項目を指定。区切った順に左から1,2,3... |
-s | 列の区切りのない行を無視する |
例)「/etc/passwd」ファイルからユーザー一覧を出力
「/etc/passwd」ファイルは、ログインを許可するユーザー一覧などを管理しています。この中から、ユーザー名だけを出力するには、下記のように指定します。
$ cut -d : -f1 /etc/passwd root daemon ...(省略)
例)カンマ区切りの2列目以降を切り出す
$ echo "field1,field2,field3,field4,field5" | cut -d , -f2- field2,field3,field4,field5
「,
(カンマ)」区切りで、2列目から最後の列まで切り出しています。
例)1文字目と3文字目を切り出す
$ echo "1234567" | cut -c1,3 13
「-d
」オプションで区切り文字を指定しない場合は、タブが使用されます。
例)スペース区切りの1列目と3列目を切り出す
$ echo "field1 field2 field3 field4 field5" | cut -d ' ' -f1,3 field1 field3
「 (空白)」区切りの場合は、「' '
(シングルクォーテーション)」、もしくは「" "
(ダブルクォーテーション)」で括ります。
cut
コマンドでは、連続する空白文字を1つの区切り文字として扱うことができません。空白区切りの列を切り出すにはawk
、sed
などが利用できます。
awk
を使うと次のように指定できます(詳細は次回以降に説明します)。
$ echo "field1 field2 field3 field4 field5" | awk '{ print $1,$3 }'