シェルスクリプトを使って作業を自動化するとき、CSVファイルを読み込んで処理を繰り返す場面はよくあります。ユーザー一覧やサーバーリスト、設定値をCSVにまとめておけば、bashでループ処理を行うだけで一括処理が可能になります。本記事では、bashでCSVを扱う基本から応用までを、実用的なサンプルとともに解説します。
bashでCSVを読み込む基本
もっともよく使われるのは、while read
構文です。IFS
(Internal Field Separator)をカンマに設定することで、CSVを1行ずつ、カンマ区切りで読み込めます。
#!/bin/bash
# users.csv の例
# name,email
# Alice,alice@example.com
# Bob,bob@example.com
while IFS=, read -r name email
do
echo "名前: $name, メール: $email"
done < users.csv
この方法では、各列をそのまま変数に代入できるので、分かりやすくシンプルです。空白を含むデータでも安全に処理できます。
配列として読み込む方法
CSVの1行を配列として扱いたい場合は、IFSを設定してread -a
オプションを使います。これにより、カンマごとに分割された要素が配列に格納されます。
while IFS=, read -r -a fields
do
echo "1列目: ${fields[0]}"
echo "2列目: ${fields[1]}"
done < data.csv
この方法は列数が多い場合や、列を動的に参照したいときに便利です。
CSVを分割して扱う方法
「特定の列だけ使いたい」といった場合には、cut
や awk
を利用するのも効果的です。
# 2列目だけを表示
cut -d, -f2 data.csv
# 1列目と3列目を処理
awk -F, '{print "列1="$1, "列3="$3}' data.csv
特にawk
は柔軟性が高く、条件分岐や計算を組み合わせた処理が可能です。
CSVをループ処理で回す
CSVを使う大きな利点は「一括処理」です。例えば、URL一覧から順番にcurlでアクセスする場合は以下のように書けます。
while IFS=, read -r id url
do
echo "ID: $id に対してアクセスします"
curl -s "$url" -o "result_${id}.html"
done < urls.csv
このようにすることで、CSVにデータを追加するだけで処理対象を増やせるため、メンテナンス性も高まります。
ExcelファイルをCSVに変換して扱う
Excelファイルをそのままbashで扱うことは難しいため、まずはCSVに変換します。Linux環境ではssconvert
やLibreOfficeのCLIを使うのが一般的です。
# ExcelをCSVに変換
ssconvert data.xlsx data.csv
# LibreOfficeを利用
libreoffice --headless --convert-to csv data.xlsx
こうしてCSVに変換してしまえば、bashスクリプトで自在に処理できます。
実践ユースケース集
ユーザー登録処理
while IFS=, read -r username email
do
useradd "$username"
echo "$username,$email を登録しました"
done < users.csv
サーバーへのSSH処理
while IFS=, read -r host ip
do
echo "サーバー $host に接続"
ssh "admin@$ip" "uptime"
done < servers.csv
データの再出力
while IFS=, read -r col1 col2 col3
do
echo "$col1,$col3" >> newdata.csv
done < olddata.csv
注意点とトラブル解決
CSVを扱う際にはいくつかの注意点があります。
- ヘッダーをスキップする
tail -n +2 file.csv
を使えば1行目を飛ばせます。tail -n +2 data.csv | while IFS=, read -r a b do echo "$a $b" done
- 改行コードの違い
Windowsで作成したCSVはCRLF改行になるため、dos2unix
で変換するのがおすすめです。 - 空白や日本語を含むデータ
read -r
を使ってバックスラッシュを解釈しないようにすると安全です。
まとめ
bashでCSVを扱う方法は、基本のwhile IFS=, read
構文を理解すれば、配列処理やcut
/awk
を組み合わせて柔軟に拡張できます。ExcelファイルもCSVに変換すれば同じ手法で処理可能です。サーバー運用やログ処理、ユーザー管理など、さまざまな業務効率化に活用できるので、ぜひ実務に取り入れてみてください。
コメント