Linuxのcutコマンドの簡単な解説
つぎのsampleというテキストファイルを題材にして cut コマンドを説明していきます。
foo,bar,baz
120,678,231
Ubuntu,Debian,CentOS
-c オプション
何文字目なのかをベースにしてテキストを切り出すには-cオプションを使います。以下はテキストの各行から最初の3文字を取り出す例です。-c1-3は1文字目から3文字目という意味です。
$ cut -c1-3 sample
foo
120
Ubu
このように cut コマンドはデフォルトでは画面(標準出力)に結果を表示します。結果をファイルに格納したかったら > の記号を使ってリダイレクトしないといけません。
$ cut -c1-3 sample > first_3
$ cat first_3
foo
120
Ubu
次は、5〜7文字目と9〜11文字目を切り出す例です。
$ cut -c5-7,9-11 sample
barbaz
678231
tu,ebi
-d 及び -f オプション
タブやカンマで区切られたフィールドごとに切り出すにはこれらのオプションを用います。上の sampleファイルはカンマで区切られていますが、カンマで区切られた2列目を表示したい場合は次のようにします。
$ cut -d, -f2 sample
bar
678
Debian
この-dは -delimiterの略です。-dの直後に,がありますから-d,で区切り記号がカンマであると指定しているのです。-dオプションを省略するとデフォルトのタブ記号をdelimiterに指定したことになります。
以下は、カンマで区切られた1番目と3番目のフィールドを抽出した例です。
$ cut -d, -f1,3 sample
foo,baz
120,231
Ubuntu,CentOS
--output-delimiter オプション
上の出力例のように、デフォルトでは -dオプションに指定したカンマを利用してフィールドは区切られます。この区切り記号を変更したい場合には--output-delimiterオプションを使います。以下は空白で区切った例です。
$ cut -d, --output-delimiter=" " -f1,3 sample
foo baz
120 231
Ubuntu CentOS
タブで区切りたい場合は技巧的ですが以下のようにするとよいでしょう。
$ cut -d, --output-delimiter="$(printf \\t)" -f1,3 sample
foo baz
120 231
Ubuntu CentOS
bash, ksh, zshでは次でもOKです(shでは機能しません)。
$ cut -d, --output-delimiter=$'\t' -f1,3 sample
foo baz
120 231
Ubuntu CentOS
上の例はシェルスクリプトの一行目で #!/bin/sh のように sh を指定してしまうと
$'文字列'
が機能せず、ねらい通りに動かないので注意してください。
他のコマンドとの連携
cutコマンドは標準入力からの入力を受け付けているので、パイプ | の右側に持ってくることができます。つぎは、grepコマンドで処理した結果を、cutコマンドで処理する例です。
$ grep [a-zA-Z] sample | cut -d, -f3
baz
CentOS
sample というファイルの中でアルファベットを含む行を grep で抽出すると
$ grep [a-zA-Z] sample
foo,bar,baz
Ubuntu,Debian,CentOS
となるはずです。この2行のデータの中で、カンマで区切られた3行目を抽出すると上のように baz と CentOS が出てくるのわけです。