tag:crieit.net,2005:https://crieit.net/tags/awk/feed 「awk」の記事 - Crieit Crieitでタグ「awk」に投稿された最近の記事 2021-12-13T23:56:29+09:00 https://crieit.net/tags/awk/feed tag:crieit.net,2005:PublicArticle/17849 2021-12-13T23:56:29+09:00 2021-12-13T23:56:29+09:00 https://crieit.net/posts/awk-only-match-last-line-for-mysql-init-password-20211213 awk で条件に合致する最後の行のみ処理する <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>次のようなシチュエーションを考えます。</p> <ul> <li>Docker 環境で MySQL の初期パスワードを変更するシェルスクリプトをエントリポイントで実行</li> <li>MySQL のログ (特に <code>mysql-error.log</code>) をボリュームマウントしてファイルの永続化を実施している</li> <li>このプロジェクトでディレクトリを使い回して1回目の MySQL のログを削除せずに2回目のビルドを実行する</li> </ul> <p>このとき、 <code>mysql-error.log</code> 内に初期パスワードが2回記録されることになります。</p> <p>すると、条件に合致する最初の行(1回目の初期パスワード)を処理しようとした際に(2回目のパスワードが設定されているため)パスワードが合致せず、処理が失敗してしまう遭遇したので対処しました。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <pre><code>- DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk '{print $13}') + DB_INIT_PASSWORD=$(sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk 'END{print $13}') </code></pre> <p>エントリポイントのシェルスクリプトで、 <code>awk</code> に <code>END</code> を付け加えました。処置としてはこれだけ。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <p>試しに、中身のシェルスクリプトを該当環境で手動で実行してみます。</p> <h3 id="変更前"><a href="#%E5%A4%89%E6%9B%B4%E5%89%8D">変更前</a></h3> <pre><code class="bash"># sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk '{print $13}' XXXXXXXXXXXX YYYYYYYYYYYY </code></pre> <p>変更前では複数マッチしていることが確認できます。このうち、最初のパスワード <code>XXXXXXXXXXXX</code> で認証をくぐって理しようとすると冒頭のようにパスワードが合致せず失敗します。</p> <h3 id="変更後"><a href="#%E5%A4%89%E6%9B%B4%E5%BE%8C">変更後</a></h3> <pre><code class="bash"># sudo grep 'temporary password' /var/log/mysql/mysql-error.log | sudo awk 'END{print $13}' YYYYYYYYYYYY </code></pre> <p>そこで変更後。今度は1回目のパスワード <code>XXXXXXXXXXXX</code> がヒットせず、2回目のパスワード <code>YYYYYYYYYYYY</code> のみがヒットするようになりました。</p> <p>これで Docker Compose 全体のビルドもコケなくなりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://orebibou.com/ja/home/201607/20160725_001/">awkで最後の行(最終行)のみ処理を行わせる | 俺的備忘録 -なんかいろいろ-</a></li> </ul> arm-band