Linux テキスト書式設定

LinuxLinuxBeginner
今すぐ練習

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

はじめに

テキストの書式設定は、Linux ユーザーやシステム管理者にとって基本的なスキルです。データを構造化された読みやすい形式で提示する能力は、レポートの作成、出力の整理、情報の理解の容易化に不可欠です。

この実験では、Linux の強力なテキスト書式設定ツールである printf コマンドの使い方を学びます。フィールドの配置、幅の指定、数値の書式設定、エスケープシーケンスの使用など、様々な書式設定技術を探索します。これらのスキルは、スクリプト、データ処理、システム管理タスクのための構造化された出力を作成するのに役立ちます。

printf の基本の紹介

Linux の printf コマンドは、データの書式設定と出力に使用されます。より単純な echo コマンドとは異なり、printf を使用すると、テキストの表示方法を正確に制御できます。

このステップでは、printf コマンドの基本的な構文を学び、最初の書式設定された出力を作成します。

まず、プロジェクトディレクトリに移動します。

cd ~/project/text_formatting

printf の基本的な構文は次の通りです。

printf "format" arguments

ここで:

  • "format" は、テキストと書式指定子を含む文字列です。
  • 書式指定子は % で始まり、引数の書式設定方法を定義します。
  • arguments は、書式設定される値です。

簡単な例を作成してみましょう。

printf "Hello, %s!\n" "World"

このコマンドでは:

  • %s は文字列の書式指定子です。
  • "World" は %s を置き換える引数です。
  • \n は末尾に改行を追加します。

次のような出力が表示されるはずです。

Hello, World!

次に、複数の引数を使用してみましょう。

printf "Name: %s, Role: %s\n" "Alice" "Engineer"

出力:

Name: Alice, Role: Engineer

書式設定されたテキストをファイルに保存してみましょう。

printf "Today's date: %s\n" "$(date +%Y-%m-%d)" > date.txt
cat date.txt

このコマンドは:

  1. $(date +%Y-%m-%d) を使用して、YYYY-MM-DD 形式で現在の日付を取得します。
  2. printf で書式設定します。
  3. 出力を date.txt という名前のファイルに保存します。
  4. ファイルの内容を表示します。

幅と配置を指定した文字列の書式設定

データを列や表形式で表示する場合、テキストの幅と配置を制御することが重要になります。このステップでは、文字列データのフィールド幅と配置を指定する方法を学びます。

幅を制御した文字列の書式指定子は、次のパターンに従います。
%[flags][width]s

ここで:

  • [width] はフィールドの最小幅を指定します。
  • [flags] は配置やその他のオプションを制御します(左揃えには - を使用)。

書式設定された列を持つファイルを作成してみましょう。

touch formatted_names.txt
printf "%-15s %-10s %s\n" "First Name" "Last Name" "Department" >> formatted_names.txt
printf "%-15s %-10s %s\n" "John" "Smith" "Engineering" >> formatted_names.txt
printf "%-15s %-10s %s\n" "Mary" "Johnson" "Marketing" >> formatted_names.txt
printf "%-15s %-10s %s\n" "Robert" "Williams" "Finance" >> formatted_names.txt
cat formatted_names.txt

この例では:

  • %-15s は、15 文字の幅で左揃えの文字列として最初の列を書式設定します。
  • %-10s は、10 文字の幅で左揃えの文字列として 2 番目の列を書式設定します。
  • %s は、標準の文字列として 3 番目の列を書式設定します。
  • \n は末尾に改行を追加します。

出力は、列が整列したきれいな表として表示されます。

First Name      Last Name  Department
John            Smith      Engineering
Mary            Johnson    Marketing
Robert          Williams   Finance

左揃えと右揃えの違いを確認するには、次のコマンドを試してみましょう。

printf "Left aligned:  '%-10s'\n" "text"
printf "Right aligned: '%10s'\n" "text"

出力:

Left aligned:  'text      '
Right aligned: '      text'

数値と小数値の書式設定

printf コマンドは、整数や浮動小数点数などの数値を書式設定するための様々なオプションを提供します。このステップでは、数値データの表示を制御する方法を学びます。

整数の場合、基本的な書式指定子は %d です。書式設定された数値を含むファイルを作成してみましょう。

touch numerical_data.txt
printf "Decimal: %d, Padded: %05d\n" 42 42 > numerical_data.txt
cat numerical_data.txt

この例では:

  • %d は数値を単純な 10 進整数として表示します。
  • %05d は数値を 5 桁の 10 進整数として表示し、先頭に 0 を埋めます。

出力:

Decimal: 42, Padded: 00042

浮動小数点数の場合、%f を使用して精度を制御できます。

printf "Float: %f, Rounded: %.2f\n" 3.14159 3.14159 >> numerical_data.txt
cat numerical_data.txt

この例では:

  • %f は完全な浮動小数点数を表示します。
  • %.2f は浮動小数点数を小数点以下 2 桁に丸めて表示します。

これで、ファイルには次の内容が含まれるようになりました。

Decimal: 42, Padded: 00042
Float: 3.141590, Rounded: 3.14

また、異なる数値体系で数値を書式設定することもできます。

printf "Decimal: %d, Hexadecimal: %x, Octal: %o\n" 16 16 16 >> numerical_data.txt
cat numerical_data.txt

ファイルに追加される出力:

Decimal: 16, Hexadecimal: 10, Octal: 20

エスケープシーケンスの使用

printf コマンドにおけるエスケープシーケンスを使用すると、書式設定されたテキストに特殊文字や制御コードを含めることができます。このステップでは、様々なエスケープシーケンスの使い方を学びます。

一般的なエスケープシーケンスには以下のようなものがあります。

  • \n - 改行
  • \t - タブ
  • \" - 二重引用符
  • \\ - バックスラッシュ
  • \b - バックスペース

エスケープシーケンスの例を含むファイルを作成してみましょう。

touch escape_sequences.txt
printf "Lines:\nFirst line\nSecond line\n" > escape_sequences.txt
printf "Tabs:\tColumn1\tColumn2\tColumn3\n" >> escape_sequences.txt
printf "Quotes: \"quoted text\"\n" >> escape_sequences.txt
cat escape_sequences.txt

出力結果から、これらのエスケープシーケンスがどのように機能するかがわかります。

Lines:
First line
Second line
Tabs:	Column1	Column2	Column3
Quotes: "quoted text"

%b 書式指定子を使用すると、引数内のエスケープシーケンスを解釈できます。

printf "%b" "Newline: \\n becomes a\nnew line\n" >> escape_sequences.txt
cat escape_sequences.txt

%b 指定子は、ASCII または Unicode 文字を表す 16 進数のエスケープシーケンスを解釈する際にも便利です。

printf "ASCII: %b\n" "\x48\x65\x6c\x6c\x6f" >> escape_sequences.txt
cat escape_sequences.txt

出力:

ASCII: Hello

書式設定されたレポートの作成

この最後のステップでは、これまで学んだテクニックを組み合わせて、見栄えの良い書式設定されたレポートを作成します。これにより、これらの書式設定スキルが実際のシナリオでどのように適用されるかを示します。

システム情報レポートを生成するスクリプトを作成しましょう。

touch system_report.sh
chmod +x system_report.sh

nano でスクリプトファイルを開きます。

nano system_report.sh

スクリプトに以下の内容を追加します。

#!/bin/bash

## 出力ファイルを定義する
report_file="system_report.txt"

## 既存のレポートをクリアする
> $report_file

## 書式設定されたヘッダーを追加する
printf "=======================================\n" >> $report_file
printf "       %s        \n" "SYSTEM INFORMATION REPORT" >> $report_file
printf "       %s        \n" "Generated on: $(date)" >> $report_file
printf "=======================================\n\n" >> $report_file

## CPU 情報
printf "%-15s %s\n" "CPU:" "$(grep "model name" /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')" >> $report_file

## メモリ情報
total_mem=$(free -m | grep Mem | awk '{print $2}')
used_mem=$(free -m | grep Mem | awk '{print $3}')
printf "%-15s %d MB (Used: %d MB)\n" "Memory:" $total_mem $used_mem >> $report_file

## ディスク情報
disk_info=$(df -h / | tail -1)
disk_size=$(echo $disk_info | awk '{print $2}')
disk_used=$(echo $disk_info | awk '{print $3}')
disk_percent=$(echo $disk_info | awk '{print $5}')
printf "%-15s %s (Used: %s, %s)\n" "Disk Space:" $disk_size $disk_used $disk_percent >> $report_file

## システム稼働時間
uptime_info=$(uptime -p)
printf "%-15s %s\n" "Uptime:" "$uptime_info" >> $report_file

## プロセスの表を追加する
printf "\n%-6s %-10s %-8s %-6s %s\n" "PID" "USER" "CPU%" "MEM%" "COMMAND" >> $report_file
printf "%-6s %-10s %-8s %-6s %s\n" "--" "----" "----" "----" "-------" >> $report_file

## CPU 使用率が高い上位 5 つのプロセスを取得する
ps aux --sort=-%cpu | head -6 | tail -5 | while read line; do
  pid=$(echo $line | awk '{print $2}')
  user=$(echo $line | awk '{print $1}')
  cpu=$(echo $line | awk '{print $3}')
  mem=$(echo $line | awk '{print $4}')
  cmd=$(echo $line | awk '{print $11}')
  printf "%-6s %-10s %-8.1f %-6.1f %s\n" "$pid" "$user" "$cpu" "$mem" "$cmd" >> $report_file
done

echo "Report generated: $report_file"

nano を保存して終了します(Ctrl+O を押してから Enter を押し、その後 Ctrl+X を押します)。

レポートを生成するためにスクリプトを実行します。

./system_report.sh

生成されたレポートを表示します。

cat system_report.txt

このレポートは様々な書式設定テクニックを組み合わせています。

  • 整理されたデータ表示のためのフィールド幅と配置
  • CPU とメモリの値の数値書式設定
  • 中央揃えのテキストを持つヘッダー
  • 列が整列した表形式のデータ

この例は、これまで学んだ書式設定テクニックが、システム情報レポートのための明確で読みやすい出力を作成するためにどのように適用できるかを示しています。

まとめ

この実験では、Linux でのテキスト書式設定に printf コマンドを使用する方法を学びました。以下のことを練習しました。

  1. 基本的な printf 構文と文字列の書式設定
  2. きれいな表形式の出力を得るためのフィールド幅と配置の制御
  3. 整数や浮動小数点数など、さまざまなタイプの数値の書式設定
  4. 出力に特殊文字を含めるためのエスケープシーケンスの使用
  5. これらのテクニックを組み合わせて、実用的なシステム情報レポートを作成する方法

これらのテキスト書式設定スキルは、シェルスクリプトで読みやすい出力を作成したり、レポートを生成したり、ターミナルで情報を整理するために不可欠です。printf コマンドを使用すると、テキストの表示方法を正確に制御できるため、Linux ユーザーやシステム管理者にとって強力なツールとなります。

Linux の学習を続ける中で、これらの書式設定テクニックは、スクリプトやコマンドラインアプリケーションでデータを明確かつプロフェッショナルに提示するために役立つことがわかるでしょう。