grepの結果を一行ずつ繰り返し処理したい

目次

スポンサードリンク

grepコマンドでは特定の文字列を含む行だけを抽出したり、正規表現にマッチする行だけを抽出することができる。
以下のようなテキストを保存したファイルがあるとする。

Domains: example.co.jp
Expiry Date: 2018-11-26 03:39:53+00:00 (INVALID: EXPIRED)
Domains: example.net
Expiry Date: 2019-02-14 03:38:25+00:00 (VALID: 62 days)
Domains: example.xyz
Expiry Date: 2019-02-14 03:40:46+00:00 (VALID: 62 days)
Domains: example.com
Expiry Date: 2019-02-14 03:41:32+00:00 (VALID: 62 days)

grepコマンドでDomainsという文字を含む行だけを抽出したい場合は以下のようにする。

$ grep "Domains" < test
Domains: example.co.jp
Domains: example.net
Domains: example.xyz
Domains: example.com

この時、抽出結果にあるドメイン名だけを対象に処理したいことがよくある。
その場合は、grepの結果を配列として保持して、後続の繰り返し処理で使用する。

#!/bin/sh

function func_main {
  # grepでドメイン名含む行を抽出し、awkでドメイン名だけ取り出して配列に格納する
  TARGET_DOMAINS=($(grep "Domains:" < test | awk '{print $2}'))

  # 配列の各要素に対して処理を実行する
  for i in ${TARGET_DOMAINS[@]}
  do
    echo $i
  done
}

func_main

exit 0

実行結果(実行権限を付与してから実行する)

$ chmod 755 test.sh
$ ./test.sh
example.co.jp
example.net
example.xyz
example.com


シェルスクリプトの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。

最短3時間で覚えるLinuxシェルスクリプト
こちらは、シェルスクリプトの基本的な書き方、デバッグ方法、if, case, while, forなど基本的な制御構文について書かれています。30日間の無料体験もできる『Kindle Unlimited』でも読むことができます。