本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「cut」コマンドです。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、テキストの行から固定長またはフィールド単位で指定した部分だけを切り出す「cut」コマンドです。
「cut」は、ファイルを読み込んで、それぞれの行から指定した部分だけを切り出すコマンドです。例えば、「3文字目から10文字目」や、タブなどで区切られたファイルから「1番目のフィールドと3番目のフィールド」のように選んで取り出すことができます。
読み込みファイルを指定しなかった場合は、標準入力から受け取った内容を処理します。
cutコマンドの主なオプションは次の通りです。
短いオプション | 長いオプション | 意味 |
---|---|---|
-b 出力リスト | --bytes=出力リスト | 切り出す位置のリストをバイト数で指定する |
-c 出力リスト | --characters=出力リスト | 切り出す位置のリストを文字数で指定する |
-f 出力リスト | --fields=出力リスト | 切り出す位置のリストをタブ区切りのフィールドで指定する(区切り文字は「-d」オプションで変更可能) |
指定 | 意味 |
---|---|
N | N番目のバイト、文字またはフィールド(行頭を1とする) |
N-M | N番目からM番目まで |
N- | N番目から行末まで |
-M | 頭からM番目まで |
短いオプション | 長いオプション | 意味 |
---|---|---|
-d 文字 | --delimiter=文字 | フィールドの区切り文字として、タブの代わりに使用する文字を指定する(1文字のみ) |
--output-delimiter=文字列 | 出力の区切り文字として使用する文字列を指定する(1文字以上が使用可能。デフォルトでは入力の区切り文字を使用) | |
-s | --only-delimited | 区切り文字を含まない行を出力しない |
--complement | 出力指定した箇所以外を出力する | |
cutコマンドは、ファイルまたは標準入力から受け取った内容に対し、それぞれの行から指定した部分だけを出力します。「何文字目から何文字目」あるいは「先頭から何文字目」「何文字目以降」といった指定が可能です。
例えば、「file.txt」を読み込んで各行の先頭10文字だけ出力したい場合は、バイト単位での指定は「cut -b 1-10 file.txt」、文字数での指定は「cut -c 1-10 file.txt」となります。
なお、シフトJISやEUC-JPでは「あいうえお」の5文字は10バイト(1文字2バイト)ですが、UTF-8では日本語部分は1文字が3バイトなので「あいうえお」は15バイトになります。CentOS 7の「端末(ターミナル)」のデフォルト文字コードはUTF-8ですので、注意してください。
切り出す位置は数値で指定します。「,」で区切ることで、複数指定することができます。
例えば、「1バイト目から10バイト目、および47バイト目以降」だけを出力する場合は、「-b 1-10,47-」と指定します。文字数ならば「-c 1-10,47-」となります。
以下の実行例では、「ls -l」コマンドの結果からファイルの種類とパーミッションを示す冒頭の10バイトと、47バイト目以降のファイル名部分を出力しています。
ls -l * | cut -b 1-10,47-
(冒頭の10バイトと47バイト目以降の部分を出力する)(画面1)
なお、出力する位置を入れ替えることはできません。「cut -b 1-10,47-」と「cut -b 47-,1-10」は、どちらも1〜10バイト目と47バイト目以降、という順番で出力されます。
CSV(comma-separated values)ファイルなど、固定長ではなく「,(カンマ)」やタブで区切られているテキストに対し、何番目のフィールドかを指定したい場合は「-f」オプションを使用します。
“何番目”の指定は「-b」や「-c」オプションと同じで、例えば、1番目から5番目ならば「-f 1-5」とします。
出力範囲を複数指定したい場合は、「,(カンマ)」で区切ります。「-f」オプションでも出力する順番を入れ替えることはできません。「-f 1,5」でも「-f 5,1」でも結果は同じで、最初に1番目のフィールド、続いて5番目のフィールドが出力されます。
デフォルトの区切り文字は「タブ(Tab)」です。区切り文字を変えたい場合は「-d」または「--delim=」で指定します。使用できるのは「,」など、1文字に限られます。空白の場合は「--delim=" "」のように指定します。
以下の実行例では、「/etc/passwd」ファイルの1番目のフィールドと7番目のフィールドを出力しています。「/etc/passwd」ファイルは「:」でフィールドが区切られ、1番目はユーザー名、7番目のフィールドはログインシェルとなっています。
cut -f 1,7 --delim=":" /etc/passwd
(1番目と7番目のフィールドだけを出力する)(画面2)
出力の区切り文字は「--output-delimiter=」オプションで変更できます。出力側の区切り文字は、何文字でも構いません。
cut -f 1,7 --delim=":" --output-delimiter=" --- " /etc/passwd
(区切り文字を「:」から「 --- 」に変更する)(画面3)
PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.