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