Help us understand the problem. What is going on with this article?

複数のファイルを終端に改行がなければ改行を追加して結合する

More than 1 year has passed since last update.

SSH の authorized_keys や SSL 証明書でサーバ証明書と中間証明書を結合するとき、単に複数のファイルを結合するなら cat すればいいだけですが、ファイルの終端が改行で終わっていない場合、改行なしでファイルが連結されてしまうことがあります。

例えば server.pem と chain.pem があったとして server.pem の終端が改行で終わっていないと cat server.pem chain.pem

-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

などとなってしまいます。

cat ではなく awk 1 で連結すれば OK です。

awk 1 server.pem chain.pem
-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

パイプするときも awk 1 を通せば終端が改行でなければ改行が追加されます。

curl -s http://gitlab.example.com/oreore.keys | awk 1

gitlab から公開鍵を取り出すと改行が無いので割と罠です。


1 は、パターンが 1 という式で、アクションは省略、という意味です。

パターンに式を記述した場合、0 ではない数字、または、空ではない文字列、のときにマッチと評価されるので、1 なら常にマッチします。

アクションが省略された場合は {print} となります。つまり、全行で print が行われます。

awk は最終行は改行が無くても行と認識します、そして print は行を改行付きで表示します。


いつも authorized_keys で awk 1 してるのなんで?と聞かれたのでその理由。

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away