RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~

f:id:tech-rakus:20200501114144j:plain

こんにちは、3年目エンジニアのaa_cryingです。 あっという間に3年目です。時が経つのは早いものですね...。
業務でJenkinsのジョブを作る・改善する機会がありました。 その際にシェルについて悩んだ末に色々学ぶことが出来たので、今回はその内容をアウトプットしたいと思います。

以下目次です。

変数を分割してfor文で回したい

複数の対象に同じ処理を実行したい場合等に便利なのが for文 です。
様々な言語にfor文は存在しますが、シェルの場合の基本文法は以下のような形です。

for 変数 in リスト
do
処理...
done

今回は、1つの変数を区切り文字で分割し、for文で回す方法です。
「指定したブランチが存在する場合にチェックアウトする」シェルを例として以下に記載します。

# ブランチ名をカンマ区切りで複数入力
echo "input branches, comma delimited. (ex. master,develop,...)"
read branches

# ブランチ毎に処理を実行
for branch in `echo $branches | sed "s/,/ /g"`; do

    if [[ $(git branch -a | grep $branch) = "" ]] ; then
        echo "branch $branch does not exists."
        exit 1      
    fi
    git checkout -b $branch origin/$branch
done

branches という変数にはカンマ(,)区切りで複数のブランチを入力します。 入力されたbranchesをリストとして認識させるため、カンマを空白に置換したいです。

ここで sed を使用します。
sed "s/aaa/bbb/g"と記述すると、「aaa」で検索しヒットした全てを「bbb」に置換します。
g を忘れてしまうと、検索してヒットした最初のものだけ置換されてしまうので注意です!

今回は、sed "s/,/ /g"と記述したので、カンマを全て半角スペースに置換してくれます。 後はfor文がリストとして認識し、回してくれます。

ファイルの○行目に追記したい

postgreSQLを使っている方だと、pg_hba.confにサーバ名を追記なんてことは日常茶飯事だと思います。
echo "ほにゃらら" >> ファイル を使用して最後尾に追記という方法もありますが、記載場所によってはうまく動作しないこともありますよね。。
viで開いて更新 or FTPソフトを使って開いて書き換え...というのも面倒...
そこで、今回は「行数を指定して挿入する」方法を紹介します。

echo "Pg connection source server IP."
read SERVER1

echo "Pg connection destination server IP."
read SERVER2

echo "PGDATA path."
read PGDATA

sudo ssh-keygen -R ${SERVER2}

sudo ssh  ${SERVER2} bash <<SHELL
    # pg_hba.confに追記して再起動
    sed -i -e "100i host    all    all    ${SERVER1}/32    trust  #test" ${PGDATA}/pg_hba.conf
    systemctl restart postgresql.service
SHELL

SERVER1 は接続元サーバのIP、SERVER2 は接続先サーバのIPとします。
「接続先サーバにSSH接続し、接続先サーバのpg_hba.confの100行目に接続元サーバの情報を追記する」という処理を行っています。

sedコマンドと言えば、正規表現を用いてファイルや標準出力の文字列置換をする使用方法が有名ですが、行の追加や挿入、削除、はたまた入出力まで出来てしまうマルチなコマンドです。 行数を指定して挿入する場合は、挿入する文言の先頭に 行数i と記載するだけです。

また-iオプションは、付けることでファイルを直接書き換えることが出来ます。
今回のようにファイルを書き換えて保存したい場合は、-i オプションを付けないと書き換わりません。

手動でやっているとpostgresqlの再起動を忘れがちだったり (私の場合) しますが、シェルに記載しておくと一気にやってくれるので便利ですね。(小声)

おわりに

今回は、業務で使えるシェルの基本的な知識を紹介しました。 本当はもう少しボリュームのある記事にしようと思っていたのですが、時間があまり取れず紹介は2つだけに。。
まだまだ勉強不足ですので知識を深め、今後もこのような形で学んだ技術を発信できたらと思います!

Copyright © RAKUS Co., Ltd. All rights reserved.