読者です 読者をやめる 読者になる 読者になる

日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です

バナー芸人衆

Mac FreeBSD awk Shell Tukubai シェル芸

TwitterとGistに投稿したが、せっかくなので忘れないうちにブログ記事にしておく。おとといに「符号化処理芸人衆」というタイトルで記事を書いたが、その中で@grethrenさんよりbannerコマンドについて教えてもらった。そういえばそんなコマンドあったね。

ところでこのbannerコマンド、MacやFreeBSDなどのBSDなシステムに付属してるものは、なかなかカッチョエエのを出力してくれる。しかし文字が右に90度回転してて、縦に流れる。こんな感じだ。
-wオプションの後の数字は横幅の文字列長で、指定無しだとデフォルトが幅132のやたらとデカくて高精細なのが出てくる。

$  banner -w 30 Go
               ##### 
           #############
         #################
        ###              ## 
        #                  #
       #                   #
        #                  #
        ##               ##
         #########      ####
            ###### 
           #### 
         #########
        ##       ##
       #           #
       #          ##
        ##       ##
         #########
           #### 

じゃあこれを90度回転させて横に並べて出力すればよかやんね?ということでシェル芸ワンライナーをやってみたよ。

まずはtrで空白と-に、#+に変換してみる。

$ banner -w 30 'Go' | tr '# ' '+-'
---------------+++++-
-----------+++++++++++++
---------+++++++++++++++++
--------+++--------------++-
--------+------------------+
-------+-------------------+
--------+------------------+
--------++---------------++
---------+++++++++------++++
------------++++++-
-----------++++-
---------+++++++++
--------++-------++
-------+-----------+
-------+----------++
--------++-------++
---------+++++++++
-----------++++-

次にawkで幅30文字埋まるまで、右側に-を追加する。

$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}'
---------------+++++----------
-----------+++++++++++++------
---------+++++++++++++++++----
--------+++--------------++---
--------+------------------+--
-------+-------------------+--
--------+------------------+--
--------++---------------++---
---------+++++++++------++++--
------------++++++------------
-----------++++---------------
---------+++++++++------------
--------++-------++-----------
-------+-----------+----------
-------+----------++----------
--------++-------++-----------
---------+++++++++------------
-----------++++---------------

ここからawkを使って行列入替処理を行う。FS=を使うと1文字ずつフィールド分割してくれて楽。

$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j=1;j<=NF;j++){for(i=1;i<=NR;i++){printf a[i,j]}print ""}}' FS=
------------------
------------------
------------------
------------------
------------------
------------------
------------------
-----+-------++---
---++-++----+--+--
--++---++--++--++-
--++----+--+----+-
-++-----+-++----++
-++-----++++----++
-++-----++++----++
-++-----++++----++
+++-----++-+----+-
+++-----++-+----+-
+++-----++-++--++-
+++---------+-++--
+++----------++---
-++---------------
-++---------------
-++---------------
-++---------------
--+-----+---------
--++---++---------
---+---++---------
----+++-+---------
------------------
------------------

上下逆さまなのでtail -rを使って上下逆転させる。trで元のバナーに戻して、更に行末の余計な空白をsedで削除で完成。

$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j=1;j<=NF;j++){for(i=1;i<=NR;i++){printf a[i,j]}print ""}}' FS= | tail -r | tr '+-' '# ' | sed 's/ *$//'


    ### #
   #   ##
  ##   ##
  #     #
 ##
 ##
 ##
 ##
###          ##
###         # ##
###     ## ##  ##
###     ## #    #
###     ## #    #
 ##     ####    ##
 ##     ####    ##
 ##     ####    ##
 ##     # ##    ##
  ##    #  #    #
  ##   ##  ##  ##
   ## ##    #  #
     #       ##

ちなみにTukubaiのtateyokoコマンドを使うと、簡単に行列入替処理が出来るぞ。

$ banner -w 30 'Go' | tr '# ' '+-' | awk '{printf $0;if(length<30)for(i=length;30-i>0;i++)printf "-";print ""}' | sed 's/./& /g' | tateyoko
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - + - - - - - - - + + - - -
- - - + + - + + - - - - + - - + - -
- - + + - - - + + - - + + - - + + -
- - + + - - - - + - - + - - - - + -
- + + - - - - - + - + + - - - - + +
- + + - - - - - + + + + - - - - + +
- + + - - - - - + + + + - - - - + +
- + + - - - - - + + + + - - - - + +
+ + + - - - - - + + - + - - - - + -
+ + + - - - - - + + - + - - - - + -
+ + + - - - - - + + - + + - - + + -
+ + + - - - - - - - - - + - + + - -
+ + + - - - - - - - - - - + + - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- + + - - - - - - - - - - - - - - -
- - + - - - - - + - - - - - - - - -
- - + + - - - + + - - - - - - - - -
- - - + - - - + + - - - - - - - - -
- - - - + + + - + - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -

Linuxで出来ないのか?と思ってたら@ebanさんより援護射撃が。UbuntuやDebianだとbsdmainutilsというパッケージの中にprinterbannerというコマンド名でBSDのbannerコマンドが移植されているらしい。

ということで、このネタから派生したTwitterのTLを@grethrenさんがTogetterでまとめてくれた。仕事早!

togetter.com

ついでにシェルスクリプトも作ったのでGistに設置。よかったらお使いあれ。UbuntuやDebianなどのLinuxでは、bsdmainutils というパッケージを入れて、シェルスクリプト12行目、banner を printerbanner に書き換えればオケ!もう一つ36行目の tail -r を tac に書き換えること。

$ coolbanner 'Hey Siri'


####   ####                           #####
 ##     ##                           #   ##
 ##     ##                           #    #
 ##     ##                          #     #  ##        ##
 ##     ##                          #        ##        ##
 ##     ##                          #        #         #
 ##     ##                          #
 ##     ##                          ##
 #########    ##   ###   ##         #####   ######  # ###
 ##     ##   # ##   ##   #           #####   ## ## ### ##
 ##     ##  ##  ##  ##   #            #####  ## ### ## ##
 ##     ##  #   ##  ##                  ###  ## ##  ## ##
 ##     ##  #    #   ## #                ### ## ##  ## ##
 ##     ## ##    #   ## #                 ## ## ##     ##
 ##     ## #######   ## #                 ## ## ##     ##
 ##     ## ##         ##                  ## ## ##     ##
 ##     ## ##         ##                  ## ## ##     ##
 ##     ##  #         ##           ##     ## ## ##     ##
 ##     ##  ##   #    ##           ##     #  ## ##     ##
 ##     ##   #  #                  ###   ##  ## ##     ##
####   ####   ##      #            #  ###   ######    ###
                      #
                      #

                     #
                   ###
                   ###

gist.github.com