はじめに
Linux テキスト切り出し実験へようこそ。この実験では、Linux の cut コマンドを使ってテキストファイルの特定の部分を抽出する方法を学びます。cut コマンドは強力なテキスト処理ツールで、ファイルの各行やパイプで渡されたデータから特定の部分を抽出することができます。
区切り文字や文字位置に基づいてテキストを抽出するために、cut コマンドの様々なオプションを使う方法を学びます。このスキルは、CSV ファイル、ログファイルなどの構造化されたテキストファイルや、一貫した形式に従ったデータを扱う際に特に有用です。
この実験の終了時には、Linux 環境でテキストデータを効率的に抽出し操作することができるようになります。これは、システム管理、データ処理、自動化タスクにおける基本的なスキルです。
cut コマンドの基本的な使い方を理解する
このステップでは、cut コマンドの基本的な使い方を学びます。Linux の cut コマンドは、ファイルの各行やパイプで渡されたデータから特定の部分を抽出するために使用されます。
まずは、操作対象となる簡単なデータファイルを作成しましょう。
cd ~/project
echo "name:age:city:occupation" > data/users.txt
echo "Alice:25:New York:Engineer" >> data/users.txt
echo "Bob:30:San Francisco:Designer" >> data/users.txt
echo "Charlie:22:Chicago:Student" >> data/users.txt
echo "Diana:28:Boston:Doctor" >> data/users.txt
上記のコマンドは、~/project/data ディレクトリに users.txt という名前のファイルを作成し、コロン区切りの値が 5 行含まれた内容を書き込みます。
では、このファイルの内容を確認しましょう。
cat data/users.txt
以下のような出力が表示されるはずです。
name:age:city:occupation
Alice:25:New York:Engineer
Bob:30:San Francisco:Designer
Charlie:22:Chicago:Student
Diana:28:Boston:Doctor
区切り文字を指定して cut を使用する
cut を使用する最も一般的な方法は、区切り文字を指定して特定のフィールドを抽出することです。基本的な構文は次の通りです。
cut -d'delimiter' -f fields file
ここで、
-dは区切り文字を指定します。-fは抽出するフィールドを指定します。fileは入力ファイルです。
データファイルから名前(最初のフィールド)を抽出してみましょう。
cut -d':' -f1 data/users.txt
このコマンドは cut に次のことを指示します。
:を区切り文字として使用する (-d':')- 最初のフィールドを抽出する (
-f1) data/users.txtファイルから
以下のような出力が表示されるはずです。
name
Alice
Bob
Charlie
Diana
では、年齢(2 番目のフィールド)を抽出してみましょう。
cut -d':' -f2 data/users.txt
出力:
age
25
30
22
28
複数のフィールドを抽出する
カンマ区切りのリストで複数のフィールドを指定することで、複数のフィールドを抽出することができます。
cut -d':' -f1,3 data/users.txt
これにより、最初と 3 番目のフィールド(名前と都市)が抽出されます。
name:city
Alice:New York
Bob:San Francisco
Charlie:Chicago
Diana:Boston
フィールドの範囲を抽出する
ハイフンを使用して、フィールドの範囲を抽出することもできます。
cut -d':' -f2-4 data/users.txt
これにより、2 番目から 4 番目のフィールド(年齢、都市、職業)が抽出されます。
age:city:occupation
25:New York:Engineer
30:San Francisco:Designer
22:Chicago:Student
28:Boston:Doctor
他のコマンドと組み合わせる
cut コマンドは、パイプを使用して他のコマンドと組み合わせることができます。たとえば、エンジニアの年齢だけを抽出するには、次のようにします。
grep "Engineer" data/users.txt | cut -d':' -f2
出力:
25
異なるフィールドの組み合わせを試して、このコマンドに慣れてみてください。
文字位置による切り出し
区切り文字に基づいてフィールドを切り出すことに加えて、cut コマンドは文字位置に基づいてテキストを抽出することもできます。これは、固定幅データ形式を扱う場合や、各行から特定の文字を抽出する必要がある場合に便利です。
固定幅データの作成
この機能を実証するために、固定幅データを持つ新しいファイルを作成しましょう。
cd ~/project
echo "ID Name Department Salary" > data/employees.txt
echo "001 John IT 75000" >> data/employees.txt
echo "002 Mary HR 65000" >> data/employees.txt
echo "003 Steve Sales 85000" >> data/employees.txt
echo "004 Jennifer Marketing 70000" >> data/employees.txt
では、このファイルを確認しましょう。
cat data/employees.txt
以下のように表示されるはずです。
ID Name Department Salary
001 John IT 75000
002 Mary HR 65000
003 Steve Sales 85000
004 Jennifer Marketing 70000
文字位置による抽出
文字位置に基づいてテキストを抽出するには、-c オプションの後に抽出したい位置を指定します。構文は次の通りです。
cut -c positions file
データファイルから社員 ID(最初の 3 文字)を抽出してみましょう。
cut -c1-3 data/employees.txt
このコマンドは、cut に各行の 1 文字目から 3 文字目までを抽出するよう指示します。以下のように表示されるはずです。
ID
001
002
003
004
特定の文字の抽出
連続していない特定の文字を抽出することもできます。
cut -c1,5,9 data/employees.txt
これは、各行の 1 文字目、5 文字目、9 文字目を抽出します。
I N
0 J
0 M
0 S
0 J
特定の位置から行末までの抽出
ある位置から行末までの文字を抽出するには、位置番号の後にハイフンを使用します。
cut -c5- data/employees.txt
これは、各行の 5 文字目から行末までの文字を抽出します。
Name Department Salary
John IT 75000
Mary HR 65000
Steve Sales 85000
Jennifer Marketing 70000
文字位置抽出とパイプの組み合わせ
cut コマンドは、パイプを使用して他のコマンドと組み合わせることができます。たとえば、給与が 70000 を超える社員の部署名(13 文字目から 22 文字目)のみを抽出するには、次のようにします。
grep -E "[7-9][0-9]000" data/employees.txt | cut -c13-22
これにより、以下のように出力されるはずです。
IT
Sales
練習問題
社員ファイルから名前(5 文字目から 12 文字目)のみを抽出してみましょう。
cut -c5-12 data/employees.txt
以下のように表示されるはずです。
Name
John
Mary
Steve
Jennifer
ご覧のとおり、文字位置による切り出しは、各行の各フィールドが特定の文字数を占める固定幅データ形式の処理に特に有用です。
cut を他のテキスト処理ツールと組み合わせる
このステップでは、cut コマンドを他の Linux テキスト処理コマンドと組み合わせて、より複雑なデータ抽出および操作タスクを実行する方法を学びます。
CSV データファイルの作成
まず、操作対象となる CSV (Comma-Separated Values、カンマ区切り値) ファイルを作成しましょう。
cd ~/project
echo "Date,Product,Quantity,Price,Total" > data/sales.csv
echo "2023-01-15,Laptop,5,1200,6000" >> data/sales.csv
echo "2023-01-16,Mouse,20,25,500" >> data/sales.csv
echo "2023-01-17,Keyboard,15,50,750" >> data/sales.csv
echo "2023-01-18,Monitor,8,200,1600" >> data/sales.csv
echo "2023-01-19,Headphones,12,80,960" >> data/sales.csv
このファイルの内容を確認しましょう。
cat data/sales.csv
以下のように表示されるはずです。
Date,Product,Quantity,Price,Total
2023-01-15,Laptop,5,1200,6000
2023-01-16,Mouse,20,25,500
2023-01-17,Keyboard,15,50,750
2023-01-18,Monitor,8,200,1600
2023-01-19,Headphones,12,80,960
cut と grep の組み合わせ
grep を使用して特定のパターンを含む行を検索し、その後 cut を使用してそれらの行から特定のフィールドを抽出することができます。
grep "Laptop" data/sales.csv | cut -d',' -f3-5
このコマンドはまず "Laptop" を含むすべての行を検索し、その後 3 番目から 5 番目のフィールド (Quantity、Price、Total) を抽出します。以下のように表示されるはずです。
5,1200,6000
cut と sort の組み合わせ
sort を使用して、特定のフィールドに基づいてデータを並べ替えることができます。
cut -d',' -f2,4 data/sales.csv | sort -t',' -k2nr
このコマンドは、Product (2 番目のフィールド) と Price (4 番目のフィールド) を抽出し、その後 Price に基づいて数値の降順で並べ替えます。-t',' オプションは sort の区切り文字を指定し、-k2 は 2 番目のフィールドでの並べ替えを示し、n は数値ソートを表し、r は降順を表します。
以下のように表示されるはずです。
Product,Price
Laptop,1200
Monitor,200
Headphones,80
Keyboard,50
Mouse,25
cut と sed の組み合わせ
sed コマンドは、基本的なテキスト変換を実行できるストリームエディタです。以下は cut と sed を組み合わせた例です。
cut -d',' -f1,2,5 data/sales.csv | sed 's/,/ - /g'
これは、Date、Product、Total フィールドを抽出し、その後すべてのカンマを " - " に置き換えます。以下のように表示されるはずです。
Date - Product - Total
2023-01-15 - Laptop - 6000
2023-01-16 - Mouse - 500
2023-01-17 - Keyboard - 750
2023-01-18 - Monitor - 1600
2023-01-19 - Headphones - 960
cut と awk の組み合わせ
awk コマンドは強力なテキスト処理ツールです。以下は cut と組み合わせる方法です。
cut -d',' -f2-4 data/sales.csv | awk -F',' 'NR > 1 {print $1 " costs $" $3 " per unit"}'
これは、2 番目から 4 番目のフィールド (Product、Quantity、Price) を抽出し、その後 awk を使用してメッセージを整形します。NR > 1 条件はヘッダー行をスキップし、print 文は出力を整形します。
以下のように表示されるはずです。
Laptop costs $1200 per unit
Mouse costs $25 per unit
Keyboard costs $50 per unit
Monitor costs $200 per unit
Headphones costs $80 per unit
複数のファイルの処理
cut を複数のファイルで使用することもできます。別のファイルを作成しましょう。
echo "Category,Product,Stock" > data/inventory.csv
echo "Electronics,Laptop,15" >> data/inventory.csv
echo "Accessories,Mouse,50" >> data/inventory.csv
echo "Accessories,Keyboard,30" >> data/inventory.csv
echo "Electronics,Monitor,20" >> data/inventory.csv
echo "Accessories,Headphones,25" >> data/inventory.csv
では、両方のファイルから Product フィールドを抽出しましょう。
cut -d',' -f2 data/sales.csv data/inventory.csv
以下のように表示されるはずです。
Product
Laptop
Mouse
Keyboard
Monitor
Headphones
Product
Laptop
Mouse
Keyboard
Monitor
Headphones
cut コマンドはすべてのファイルを処理し、すべての結果を順次出力します。両方のヘッダー行が含まれていることに注意してください。
cut を他のテキスト処理ツールと組み合わせることで、Linux で高度なデータ操作タスクを効率的に実行することができます。
cut コマンドの実用的な応用
このステップでは、実際のシナリオで遭遇する可能性のある cut コマンドのいくつかの実用的なアプリケーションを探ります。
ログファイルの分析
ログファイルは、テキスト処理ツールの一般的な使用例です。簡単な Apache 形式のアクセスログファイルを作成しましょう。
cd ~/project
cat > data/access.log << EOF
192.168.1.100 - - [15/Feb/2023:10:12:01 -0500] "GET /index.html HTTP/1.1" 200 2048
192.168.1.102 - - [15/Feb/2023:10:13:25 -0500] "GET /images/logo.png HTTP/1.1" 200 4096
192.168.1.103 - - [15/Feb/2023:10:14:10 -0500] "POST /login.php HTTP/1.1" 302 1024
192.168.1.100 - - [15/Feb/2023:10:15:30 -0500] "GET /dashboard.html HTTP/1.1" 200 3072
192.168.1.104 - - [15/Feb/2023:10:16:22 -0500] "GET /css/style.css HTTP/1.1" 404 512
192.168.1.105 - - [15/Feb/2023:10:17:40 -0500] "GET /index.html HTTP/1.1" 200 2048
EOF
ログファイルから IP アドレス(最初のフィールド)を抽出しましょう。
cut -d' ' -f1 data/access.log
以下のように表示されるはずです。
192.168.1.100
192.168.1.102
192.168.1.103
192.168.1.100
192.168.1.104
192.168.1.105
では、HTTP ステータスコード(9 番目のフィールド)を抽出しましょう。
cut -d' ' -f9 data/access.log
以下のように表示されるはずです。
200
200
302
200
404
200
設定ファイルの処理
もう 1 つの一般的な使用例は、設定ファイルの処理です。簡単な設定ファイルを作成しましょう。
cat > data/config.ini << EOF
[Database]
host=localhost
port=3306
user=dbuser
password=dbpass
[Server]
host=192.168.1.10
port=8080
maxConnections=100
[Logging]
level=INFO
file=/var/log/app.log
EOF
すべてのパラメータ名(等号の前の部分)を抽出するには、次のようにします。
grep -v "^\[" data/config.ini | cut -d'=' -f1
このコマンドは、grep -v "^\[" を使用してセクションヘッダー([ で始まる行)を除外し、その後 cut を使用して = の前の部分を抽出します。以下のように表示されるはずです。
host
port
user
password
host
port
maxConnections
level
file
レポート用に CSV ファイルからデータを抽出する
学生の成績を表すより複雑な CSV ファイルを作成しましょう。
cat > data/grades.csv << EOF
StudentID,Name,Math,Science,English,History,Average
S001,John Smith,85,92,78,88,85.75
S002,Mary Johnson,90,88,92,85,88.75
S003,Robert Davis,78,80,85,92,83.75
S004,Jennifer Lee,95,93,90,87,91.25
S005,Michael Brown,82,85,88,90,86.25
EOF
学生の名前と平均成績を示す簡単なレポートを生成するには、次のようにします。
tail -n +2 data/grades.csv | cut -d',' -f2,6
tail -n +2 コマンドはヘッダー行をスキップし、cut は Name と Average フィールドを抽出します。以下のように表示されるはずです。
John Smith,85.75
Mary Johnson,88.75
Robert Davis,83.75
Jennifer Lee,91.25
Michael Brown,86.25
平均成績が 85 を超える学生を見つけるには、次のようにします。
tail -n +2 data/grades.csv | cut -d',' -f2,6 | awk -F',' '$2 > 85 {print $1 " has an average of " $2}'
以下のように表示されるはずです。
John Smith has an average of 85.75
Mary Johnson has an average of 88.75
Jennifer Lee has an average of 91.25
Michael Brown has an average of 86.25
コマンド出力から特定の列を抽出する
cut を使用して、コマンド出力から特定の列を抽出することができます。たとえば、現在のディレクトリ内のファイル名とサイズのみをリストするには、次のようにします。
ls -l ~/project/data | tail -n +2 | cut -d' ' -f5,9
このコマンドは、ファイルを詳細表示形式でリストし、ヘッダー行をスキップし、サイズ(5 番目のフィールド)と名前(9 番目のフィールド)を抽出します。正確な出力はファイルによって異なりますが、次のようなものになります。
237 access.log
99 config.ini
203 employees.txt
179 grades.csv
110 inventory.csv
150 sales.csv
264 users.txt
これらの例は、cut コマンドが様々な実用的なシナリオでテキストデータの特定の部分を抽出および処理するためにどのように使用できるかを示しています。
まとめ
この実験では、Linux の cut コマンドを使用してファイルからテキストの特定の部分を抽出する方法を学びました。以下の内容をカバーしました。
- 区切り文字を使用した
cutの基本的な使い方で、構造化されたテキストファイルからフィールドを抽出する方法 - 固定幅データ形式の場合、文字位置に基づいてテキストを抽出する方法
grep、sort、sed、awkなどの他のテキスト処理ツールとcutを組み合わせて、より複雑なデータ操作を行う方法- ログ分析、設定ファイルの処理、データレポート作成などの一般的なシナリオでの
cutコマンドの実用的なアプリケーション
cut コマンドは、Linux のテキスト処理ツールキットにおける強力なツールです。最初は簡単に見えるかもしれませんが、テキストの特定の部分を抽出する能力は、多くのデータ処理タスクにおいて非常に価値があります。パイプを介して他の Linux コマンドと組み合わせると、柔軟で強力なテキスト処理システムの一部となります。
いくつかの重要なポイントをまとめます。
- 構造化されたテキストを扱う際には、
-dで区切り文字を指定し、-fでフィールドを選択します。 - 固定幅データを扱う際には、
-cで特定の文字を抽出します。 - より高度な処理を行うために、パイプを使用して
cutを他のコマンドと組み合わせます。 - データが一貫した形式に従っている場合、
cutコマンドが最も効果的です。
これらのスキルを身につけることで、Linux 環境でテキストデータを効率的に抽出および処理することができます。これは、様々な管理およびデータ処理タスクに不可欠です。



