【Linux】ファイルを一行ずつ読み込んで処理をする(curlとか)

Linuxコマンド シェル

やりたいこと

次のようなURLのリストファイルがあり、サクッとリクエストして結果(ステータスコード)を確認したい。

url_list.txt

localhost:8080/1
localhost:8080/2
localhost:8080/3

一行ずつファイルを読み込む

考え方としては、

  1. catコマンドでファイルの内容を表示
  2. 上記コマンドの実行結果を一行ずつwhile文で読み取る

シェルスクリプトを書く場合、基本的な構文は以下の通りである。

cat ファイル名 | while read 読み込み変数名
do
  # 処理
done

実際に読み込んだファイルのそれぞれの行に「request」という文字を追加してみる。

request.sh

#!/bin/bash

cat url_list.txt | while read url
do
  echo "request: ${url}"
done

exit 0

実行結果

$ bash request.sh
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3

処理部分でcurlを実行する

echoしていた部分をcurlコマンドに置き換えれば良い。

※たくさん叩くときはsleepコマンドで休憩を入れてあげること!

#!/bin/bash

cat url_list.txt | while read url
do
  curl -XGET ${url} -s -w "%{http_code}\n" -o /dev/null
  sleep 3
done

exit 0

curlコマンドのオプションは以下の通り。

  • -s:リクエストの進捗状況を非表示にする
  • -w %{http_code}:指定したパラメータを取得(この場合はステータスコード)
  • -o /dev/null:リクエストボディを/dev/nullに捨てる

ワンライナーでサクッと実行する

わざわざスクリプトファイルを作成しても良いが、
慣れてくると面倒になり、ワンライナーで実行するようになる。

ポイントは以下の通り。

  • シェルスクリプトで改行していた部分は「;」で区切る
  • 一行で実行したい箇所を複数行で実行したい場合は「\」を使うと、見た目上改行できる
$ cat url_list.txt | while read url; do echo "request: ${url}"; sleep 1; done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3

シェルスクリプトと同じような箇所で改行。

$ cat url_list.txt | while read url;
> do echo "request: ${url}";
> sleep 1;
> done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3

whileとreadは本来同一行に記述するが、「\」を挟むことで見た目だけ改行できる。

$ cat url_list.txt | while \
> read url;
> do
> echo "request: ${url}";
> sleep 1;
> done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3

まとめ

  • cat ファイル名 | while read 変数」で一行ずつ読み込む
  • ワンライナーで実行する場合「;」で改行になる
  • 連続でcurl実行時はsleepコマンドを必ず挟むこと
タイトルとURLをコピーしました