Linux テキストの切り出し

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux テキスト切り出し実験へようこそ。この実験では、Linux の cut コマンドを使ってテキストファイルの特定の部分を抽出する方法を学びます。cut コマンドは強力なテキスト処理ツールで、ファイルの各行やパイプで渡されたデータから特定の部分を抽出することができます。

区切り文字や文字位置に基づいてテキストを抽出するために、cut コマンドの様々なオプションを使う方法を学びます。このスキルは、CSV ファイル、ログファイルなどの構造化されたテキストファイルや、一貫した形式に従ったデータを扱う際に特に有用です。

この実験の終了時には、Linux 環境でテキストデータを効率的に抽出し操作することができるようになります。これは、システム管理、データ処理、自動化タスクにおける基本的なスキルです。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/cut("Text Cutting") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-271259{{"Linux テキストの切り出し"}} linux/cut -.-> lab-271259{{"Linux テキストの切り出し"}} linux/grep -.-> lab-271259{{"Linux テキストの切り出し"}} end

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 コマンドは、基本的なテキスト変換を実行できるストリームエディタです。以下は cutsed を組み合わせた例です。

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 の基本的な使い方で、構造化されたテキストファイルからフィールドを抽出する方法
  • 固定幅データ形式の場合、文字位置に基づいてテキストを抽出する方法
  • grepsortsedawk などの他のテキスト処理ツールと cut を組み合わせて、より複雑なデータ操作を行う方法
  • ログ分析、設定ファイルの処理、データレポート作成などの一般的なシナリオでの cut コマンドの実用的なアプリケーション

cut コマンドは、Linux のテキスト処理ツールキットにおける強力なツールです。最初は簡単に見えるかもしれませんが、テキストの特定の部分を抽出する能力は、多くのデータ処理タスクにおいて非常に価値があります。パイプを介して他の Linux コマンドと組み合わせると、柔軟で強力なテキスト処理システムの一部となります。

いくつかの重要なポイントをまとめます。

  • 構造化されたテキストを扱う際には、-d で区切り文字を指定し、-f でフィールドを選択します。
  • 固定幅データを扱う際には、-c で特定の文字を抽出します。
  • より高度な処理を行うために、パイプを使用して cut を他のコマンドと組み合わせます。
  • データが一貫した形式に従っている場合、cut コマンドが最も効果的です。

これらのスキルを身につけることで、Linux 環境でテキストデータを効率的に抽出および処理することができます。これは、様々な管理およびデータ処理タスクに不可欠です。