ChatGPTにシェルスクリプトを作ってもらう
こんにちは、HKです。突然ですが、みなさんはChatGPTをご存じですか?
ChatGPTとは、OpenAIという企業が提供している人工知能(AI)チャットボットです。チャットの会話形式でAIに質問ができる便利なツールですが、持っている情報が微妙に古かったり情報が必ずしも正確ではなかったりするので、まだまだ使う側のリテラシーが大事です。
今回は、そんなChatGPTを使って、テキストファイルの中身を整形するシェルスクリプトを作成する機会があったので、どのような流れで活用したかをご紹介します。
まず、以下のような内容のテキストファイルがあります。
$ cat file.txt
cat /home/vpopmail/domains/0/example1.com/account/.qmail
./Maildir/
&account@example6.com
cat /home/vpopmail/domains/0/example2.com/account/.qmail
./Maildir/
&account@example7.com
cat /home/vpopmail/domains/example3.com/account/.qmail
./Maildir/
&account@example6.com
&account@example8.com
cat /home/vpopmail/domains/example4.com/account/.qmail
./Maildir/
&account@example9.jp
cat /home/vpopmail/domains/0/example5.com/account/.qmail
./Maildir/
&account@example6.com
&account@example10.co.jp
ファイルの内容を簡単に説明すると、qmailの転送先の一覧を抜き出して出力したものです。
上のファイル内容そのままだとどこがどこに転送しているかが分かりづらいので、見やすい形に整形してくれるシェルスクリプトをChatGPTに作ってもらいましょう。
整形してほしいテキストファイルの中身と、どんな感じで出力してほしいかのイメージを伝えて、シェルスクリプトを作ってもらいます。
#!/bin/bash
# ファイルパスを指定
files=(
"/home/vpopmail/domains/0/example1.com/account/.qmail"
"/home/vpopmail/domains/0/example2.com/account/.qmail"
)
for file in "${files[@]}"; do
# ドメインとアカウントを抽出
domain="$(echo "$file" | cut -d'/' -f6)"
account="$(echo "$file" | cut -d'/' -f7)"
# 転送元メールアドレスを生成
source_email="${account}@${domain}"
# 転送先メールアドレスを抽出
dest_email="$(grep '^&' "$file" | cut -c2-)"
echo "-----------------------"
echo "転送元"
echo "$source_email"
echo
echo "転送先"
echo "$dest_email"
echo "-----------------------"
done
……こちらの要求がうまく伝わっていない感じがします。もう少し内容を補足してみましょう。
#!/bin/bash
file="path/to/your/file.txt"
# ファイルを4行ずつ処理
while read -r line1; do
read -r line2
read -r line3
read -r line4
# ドメインとアカウントを抽出
domain="$(echo "$line1" | cut -d'/' -f6)"
account="$(echo "$line1" | cut -d'/' -f7)"
# 転送元メールアドレスを生成
source_email="${account}@${domain}"
# 転送先メールアドレスを抽出
dest_email="$(echo "$line3" | cut -c2-)"
echo "-----------------------"
echo "転送元"
echo "$source_email"
echo
echo "転送先"
echo "$dest_email"
echo "-----------------------"
done < "$file"
今度はちゃんとこちらの言いたいことが伝わった感じがします。早速シェルスクリプトを試してみます。
$ ./format_output01.sh
-----------------------
転送元
account@example1.com
転送先
account@example6.com
-----------------------
-----------------------
転送元
@
転送先
at /home/vpopmail/domains/example3.com/account/.qmail
-----------------------
-----------------------
転送元
&account@example6.com@&account@example6.com
転送先
at /home/vpopmail/domains/example4.com/account/.qmail
-----------------------
-----------------------
転送元
&account@example9.jp@&account@example9.jp
転送先
/Maildir/
-----------------------
-----------------------
転送元
&account@example10.co.jp@&account@example10.co.jp
転送先
-----------------------
いい感じだと思いましたが、イメージ通りの表示がされません。シェルスクリプトの精度を上げるために、この時点で思いつく情報を補足していきましょう。
#!/bin/bash
file="path/to/your/file.txt"
# ファイルを1行ずつ処理
while read -r line; do
if [[ $line =~ ^cat ]]; then
if [[ ! -z "$source_email" ]]; then
echo "転送元"
echo "$source_email"
echo
echo "転送先"
printf '%s\n' "${dest_emails[@]}"
echo "-----------------------"
# 配列をリセット
dest_emails=()
fi
# ドメインとアカウントを抽出
domain="$(echo "$line" | awk -F'/' '{ for(i=1; i<=NF; i++) if($i ~ "^[^0-9]+[0-9]*\\.com$") { print $i } }')"
account="$(echo "$line" | awk -F'/' '{ print $(NF-1) }')"
# 転送元メールアドレスを生成
source_email="${account}@${domain}"
elif [[ $line =~ ^\& ]]; then
# 転送先メールアドレスを抽出し、配列に追加
dest_email="$(echo "$line" | cut -c2-)"
dest_emails+=("$dest_email")
fi
done < "$file"
# 最後の設定を出力
echo "転送元"
echo "$source_email"
echo
echo "転送先"
printf '%s\n' "${dest_emails[@]}"
echo "-----------------------"
今度はどうでしょうか。
$ ./format_output02.sh
転送元
account@example1.com
転送先
account@example6.com
-----------------------
転送元
account@example2.com
転送先
account@example7.com
-----------------------
転送元
account@example3.com
転送先
account@example6.com
account@example8.com
-----------------------
転送元
account@example4.com
転送先
account@example9.jp
-----------------------
転送元
account@example5.com
転送先
account@example6.com
account@example10.co.jp
-----------------------
最初のイメージ通りに整形ができました。
今回紹介した活用方法はほんの一例ですが、今回のように、最初の出力結果にチャット形式で次々に注文を足していっても、都度それに答えてくれるのがChatGPTを使っていて便利だと感じたところです。
もちろん、出力された結果を鵜吞みにせず、どういった内容のシェルスクリプトなのかを自分で理解するリテラシーは必要になりますが、使いこなせれば強力な武器になると感じました。
いざChatGPTの便利さを味わってみると、今後どんどん世の中にAIが普及していくような気がしますが、うまく付き合っていきたいですね。
それでは、また。