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

  • December 15, 2018
  • linux

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

スポンサーリンク