その他

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    サーバごとの設定値って大抵同じところに入っていますよね…。ならそれを参照して使えばいいのでは。そんな考えから生まれた記事です。

    はじめに

    シェルスクリプトを書いているうちに組み合わせると良さそうだなと思ったコマンドがあったので少し紹介を。
    本記事ではgrep、awkを取り上げています。

    使用例

    ファイルの中身(setting.propertiesとします)
    something.filepath=something.log
    something.filename=wrongfile.log
    
    $ grep 'something.filepath' ./setting.properties | awk -F'=' '{print $2}'
    
    結果
    something.log
    

    設定ファイルlogファイル名を入れた際、どの変数に入れたかわかっていれば検索できます。
    もちろんlogファイル名がわかっている場合でも同じ結果が表示されますが、ファイル名で検索する場合は「どこで使われているか」が目的になるので awk を利用することはありません。

    これをシェルスクリプトで用いるのであれば、例えば設定するファイルが存在するか判定して条件分岐を行う用途があります。
    もし存在しなければ処理を行わない、サーバ管理者に通知する…などでしょうか。
    ファイル名に限らず、特定の値を抽出するのにも利用できます。

    例1

    xml内(about.xmlとします)
    <title>DoRuby</title>
    <page>30</page>
    <pageTitle>What is DoRuby?</pageTitle>
    
    $ grep '<page>' ./about.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
    
    結果
    30
    

    例2

    ファイルの中身(setting.propertiesとします)
    [色々な設定]
    app_env=test
    [色々な設定]
    
    スクリプト
    #!/bin/bash
    set -eu
    # ^が使えるので利用します
    app_env=$(grep '^app_env' ./setting.properties | awk -F'=' '{print $2}')
    if [ "${app_env}" = "test" ]; then
      # テスト環境用の処理を書く
    elif [ "${app_env}" = "production" ]; then
      # 本番環境用の処理を書く
    else
      echo "Missing app_env value."
      exit
    fi
    
    echo "Script completed."
    

    set -e を使っている間は grep の結果が0件にならないようにしてください。ただ検索系のコマンドである以上0件もありうるため、その場合は以下のようにして回避します。

    ・grepのある行で処理する場合
    grep '検索文字' || :
    
    ・setを使う場合
    set +e # エラー発生時、強制終了しないように変更
    grep '検索文字'
    set -e # エラー発生時、強制終了するように変更
    
    ・この記載は戻り値が最後の処理に依存します(今回の例2はok)。'>'といったファイル出力では回避できないので注意
    grep '検索文字' | 何かの処理
    

    エラーとみなされる原因として、 grep の取得件数が0件の時、各処理で確認できる戻り値 $? が正常終了である0ではなく1になるためです。そのためエラーだと誤認して処理が途中で止まってしまいます。

    おわりに

    単純に1コマンドを扱うのではなく、複数のコマンドをつなげる機会が増えてきたのでちょっとした紹介をしました。例は単純なものですので実際に運用する際は、複数参照したり検索ワードを変えたりとなりますが、きっかけになれば幸いです。
    操作できることが増えると楽しくなりますね…一方でミスした時のリスクが怖いので、動作するかの確認は怠らないよう心がけています。


    参考:
    要素検索してパラメータを取得するsed