インフラ

シェルスクリプトの使用例

さまざまなケースについてシェルスクリプトの使用例を紹介します

ログファイルからエラーメッセージを抽出

test.sh
#!/bin/bash
# このスクリプトはログファイルからエラー行を抽出して表示します。

LOG_FILE="sample.log"

# ログファイルが存在するか確認
if [ ! -f "$LOG_FILE" ]; then
  echo "ログファイルが見つかりません: $LOG_FILE"
  exit 1
fi

# エラー行を抽出
echo "エラー行を抽出中..."
awk '/ERROR/ {print $0}' "$LOG_FILE"
sample.log
INFO: System initialized successfully.
ERROR: Failed to connect to database.
INFO: Retrying connection...
ERROR: Connection timed out.
INFO: Shutdown completed.
実行結果
$ ./test.sh
エラー行を抽出中...
ERROR: Failed to connect to database.
ERROR: Connection timed out.

 

特定のカラムを抽出

test.sh
#!/bin/bash
# このスクリプトはCSVから名前とスコアのカラムを抽出します。

CSV_FILE="data.csv"

# ヘッダーを除外して2列目と3列目を表示
awk -F, 'NR > 1 {print $2, $3}' "$CSV_FILE"
data.csv
ID,Name,Score
1,Alice,85
2,Bob,90
3,Charlie,78
実行結果
$ ./test.sh
Alice 85
Bob 90
Charlie 78

 

特定のカラムを抽出2

test.sh
#!/bin/bash

# データを加工して保存する関数
process_data() {
  local file=$1
  local output_file="modified_$file"

  echo "Processing file: $file"
  
  # ファイル内容を確認
  echo "Original file content:"
  cat "$file"
  echo ""

  # awkで特定列を抽出(例: 2列目と3列目)
  echo "Extracting specific columns using awk:"
  awk -F, 'NR > 1 {print $2, $3}' "$file"
  echo ""

  # sedで2列目に文字列を追加し、新しいファイルに保存
  echo "Modifying data using sed and saving to $output_file:"
  sed 's/\([^,]*,[^,]*\)/\1 (Modified)/' "$file" > "$output_file"

  # 加工後のファイル内容を確認
  echo "Modified file content:"
  cat "$output_file"
  echo "--------------------------"
}

# ファイルを処理する関数
process_files() {
  for file in "$@"; do
    if [[ -f $file ]]; then
      process_data "$file"
    else
      echo "File not found: $file"
    fi
  done
}

# メイン処理
main() {
  echo "Starting script..."
  
  # ファイル名を指定
  CSV_FILES=("data1.csv" "data2.csv" "data3.csv")

  # 複数ファイルを順次処理
  process_files "${CSV_FILES[@]}"
  
  echo "Script completed."
}

# スクリプトを実行
main

awk -F, ‘NR > 1 {print $2, $3}’ “$file”

コマンドの構成要素
・awk: テキスト処理ツール。行ごとに処理を行い、指定した条件や操作に従って出力します。

・-F,: フィールド区切り文字(デリミタ)をカンマ(,)に設定します。
デフォルトでは空白やタブが区切り文字ですが、このオプションで CSV ファイルのようにカンマ区切りを解析できます。

・NR > 1: 条件式で、「現在の行番号(NR)」が1より大きい行を対象に処理します。
最初の行(通常、ヘッダー行)はスキップする設定。

・{print $2, $3}: 2列目($2)と3列目($3)のデータを出力します。
各フィールドはカンマ(-F, で指定)で分割された部分に対応します。

・”$file”: 処理対象のファイル(変数として指定)。

sed ‘s/\([^,]*,[^,]*\)/\1 (Modified)/’ “$file” > “$output_file”

コマンドの構成要素
・sed:
テキストを加工するためのツール。

・s/ … /:
置換コマンド(s は substitute の略)。
/ はパターンと置換後の文字列を区切るための記号。

・\([^,]*,[^,]*\):
正規表現で、特定の部分をキャプチャ(保存)しています。

・\1 (Modified):
キャプチャした部分に (Modified) を付加します。

・”$file”:
加工する元のファイル。

・>:
出力を新しいファイルにリダイレクト。

・”$output_file”:
加工後の内容を保存する新しいファイル名。

・[^,]*,[^,]* の役割:
カンマで区切られた最初の2つのフィールドを対象にします。
例:Alice,30 の部分が一致。

・\1 の役割:
キャプチャした部分をそのまま出力します。

・(Modified):
キャプチャした部分の後ろに付加される文字列です。

・> の役割:
元のファイルを上書きせず、加工後のデータを新しいファイルに保存。

data1.csv
ID,Name,Age
1,John,25
2,Jane,30
modified_data1.csv
ID,Name (Modified),Age
1,John (Modified),25
2,Jane (Modified),30
実行結果
$ ./test.sh
Starting script...
Processing file: data1.csv
Original file content:
ID,Name,Age
1,John,25
2,Jane,30

Extracting specific columns using awk:
John 25
Jane 30

Modifying data using sed and saving to modified_data1.csv:
Modified file content:
ID,Name (Modified),Age
1,John (Modified),25
2,Jane (Modified),30
--------------------------
Processing file: data2.csv
Original file content:
ID,Name,Age
3,Bob,22
4,Alice,27

Extracting specific columns using awk:
Bob 22
Alice 27

Modifying data using sed and saving to modified_data2.csv:
Modified file content:
ID,Name (Modified),Age
3,Bob (Modified),22
4,Alice (Modified),27
--------------------------
Processing file: data3.csv
Original file content:
ID,Name,Age
5,Mike,35
6,Susan,28

Extracting specific columns using awk:
Mike 35
Susan 28

Modifying data using sed and saving to modified_data3.csv:
Modified file content:
ID,Name (Modified),Age
5,Mike (Modified),35
6,Susan (Modified),28
--------------------------
Script completed.