さまざまなケースについてシェルスクリプトの使用例を紹介します
ログファイルからエラーメッセージを抽出
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.