シェル(Bash)でKEY、VALUE形式のファイルから値を取得する方法を紹介します。
1. コメント、空行を外すコマンド
cat <ファイル名> | grep -v '^\s*$' | grep -v '^\s*#'
または
grep -v -e '^\s*$' -e '^\s*#' <ファイル名>
- grepの
-v
オプションは一致するものを除外 - 正規表現の
^
は行の先頭 - 正規表現の
$
は行の末尾 - 正規表現の
s
は空白文字(半角スペース、\t、\n、\r、\f) - 正規表現の
*
は直前のパターンの0回以上の繰り替えし
実行例は以下の通りです。
# comments
key01=value01
key02=value02
#key02=value02
key03=value03
key04=value04
key05=value05
[root@centos85 ~]# cat test.conf | grep -v '^\s*$' | grep -v '^\s*#'
key01=value01
key02=value02
key03=value03
key04=value04
key05=value05
[root@centos85 ~]#
[root@centos85 ~]# grep -v -e '^\s*$' -e '^\s*#' test.conf
key01=value01
key02=value02
key03=value03
key04=value04
key05=value05
[root@centos85 ~]#
2. KEY値で検索
cat <ファイル名> | grep -v '^\s*$' | grep -v '^\s*#' | grep <検索するKEY値>
または
grep -v -e '^\s*$' -e '^\s*#' <ファイル名> | grep <検索するKEY値>
[root@centos85 ~]# cat test.conf | grep -v '^\s*$' | grep -v '^\s*#' | grep key02
key02=value02
[root@centos85 ~]#
[root@centos85 ~]# grep -v -e '^\s*$' -e '^\s*#' test.conf | grep key02
key02=value02
[root@centos85 ~]#
3. =
で分割し2項目目を取得しVALUE値を取得
cat <ファイル名> | grep -v '^\s*$' | grep -v '^\s*#' | grep <検索するKEY値> | cut -d "=" -f 2
または
grep -v -e '^\s*$' -e '^\s*#' <ファイル名> | grep <検索するKEY値> | cut -d "=" -f 2
- cutコマンドの
-d
オプションで=
で分割 - cutコマンドの
-f
オプションで2
項目目を取得
[root@centos85 ~]# cat test.conf | grep -v '^\s*$' | grep -v '^\s*#' | grep key02 | cut -d "=" -f 2
value02
[root@centos85 ~]#
[root@centos85 ~]# grep -v -e '^\s*$' -e '^\s*#' test.conf | grep key02 | cut -d "=" -f 2
value02
[root@centos85 ~]#
KEY値を指定して、VALUE値を取得することができました。
4. その他
sed
コマンドを使って置換して、KEY値からVALUE値を取得することもできます。
cat test.conf | grep -v '^\s*$' | grep -v '^\s*#' | grep "key02" | sed -r s:'key02='::
[root@centos85 ~]# cat test.conf | grep -v '^\s*$' | grep -v '^\s*#' | grep "key02" | sed -r s:'key02='::
value02
[root@centos85 ~]#
以上