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

それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

文字列を逆順にするコマンド rev/ 行を逆さに並べる tac

linux bash

文字列を逆順にするコマンド。

ls の結果が長くて逆順に出したいと起動するか。たぶん最初に習ってるはずなんだけどよく忘れるんだよね。

tac コマンド。

tac コマンドは、cat の逆だからtac 覚えやすい。覚えやすいのにめったに使わないから忘れるw

tac コマンドで入力行を逆順に出すことが出来る。

どういうときに便利なの?

ls -l などの結果でファイル名順に並ぶけど、日付順に並ばないとかのときに便利。

ファイルのタイムスタンプが全部おなじになっちゃって、ファイル名に含まれる日付で並べなくちゃいけないときなど。しかもリスト表示すると sort 使えないというようなとき

takuya@ log $ ls -l | tac | head 
-rw-r--r-- 1 takuya takuya   40627  4月 16  2015 zip2mobi.log.20141013
-rw-r--r-- 1 takuya takuya   61340  4月 16  2015 zip2mobi.log.20140912
-rw-r--r-- 1 takuya takuya   35899  4月 16  2015 zip2mobi.log.20140831
-rw-r--r-- 1 takuya takuya   23630  4月 16  2015 zip2mobi.log.20140810
-rw-r--r-- 1 takuya takuya   38588  4月 16  2015 zip2mobi.log.20140802

文字列を逆にする rev

rev コマンドで文字列を1行ずつ逆にすることが出来る。 いまのところ何に使うか全く見当がつかない。

takuya@ log $ ls -l | tac | head | rev
31014102.gol.ibom2piz 5102  61 月4  72604   ayukat ayukat 1 --r--r-wr-
21904102.gol.ibom2piz 5102  61 月4  04316   ayukat ayukat 1 --r--r-wr-
13804102.gol.ibom2piz 5102  61 月4  99853   ayukat ayukat 1 --r--r-wr-
01804102.gol.ibom2piz 5102  61 月4  03632   ayukat ayukat 1 --r--r-wr-
20804102.gol.ibom2piz 5102  61 月4  88583   ayukat ayukat 1 --r--r-wr-

tac / rev と banner コマンドを組み合わせて遊ぶ

rev 何に使えるか全く想像付かないので、少し調べたら banner コマンドと合わてあそぶと楽しそうな例が紹介されてた

私もヤってみた

banner コマンドのインストール

sudo apt install sysvbanner

banner コマンドとrev / cat で遊びます。

takuya@:~$ banner  osaka

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

takuya@:~$ banner  osaka| tac

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

takuya@:~$ banner  osaka| tac| rev

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

takuya@:~$ banner  osaka| rev

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

takuya@:~$ banner  osaka| rev| tac

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

これってbanner コマンドが便利なだけじゃ・・・

参考資料

しげふみメモ : Linuxのrevコマンドで文字を逆に並べる

bashのパラメータ展開での拡張子・ディレクトリ名・ファイル名の取得・拡張子の置換

bash

bash でファイル名から拡張子を取出す方法

ファイル名から拡張子を取出すのはカンタンでした。

path=/etc/apache2/httpd.conf
extension=${path##*.}  #=> conf

魔法の記述方法 ${varname##*.} を使うと 手軽に拡張子を取得できる。

拡張子を書き換える方法

拡張子を書き換えるには、変数の書き換えを使えば直ぐ出来る。

f_name=httpd.conf
txt_name=${f_name/.*/.txt}   #=> httpd.txt

basename / dirname の取得

basename や dirname も文字列マッチで行うことが出来る。

path=/etc/apache2/httpd.conf
basename=${path##*/} #=> httpd.conf
dirname=${path%/*} #=>/etc/apache2

仕組みについて

何でこんな不思議な事が出来るのか ${varname##*.} のような記述方法は何のか。

Man page of BASH によると パラメータの展開 と呼ばれる機能だとわかった。

パラメータ展開について

bash には 変数の展開で、アレコレできるような機能が備わってる

記述方法 意味
${parameter%word} 後方マッチ削除
${parameter%%word} 後方マッチ削除(最長マッチ)
${parameter#word} 前方マッチ削除
${parameter##word} 前方マッチ削除(最長マッチ)
${parameter/search/replacement} マッチ置換

わかりにくいので、正規表現と対表作ってみる(bashはglobマッチなので厳密には一致しないがイメージとして覚えておくために)

記述方法 意味
${parameter%%word} parameter.replace( /(word)(.*)/ , '$1' )
${parameter##word} parameter.replace( /(word)(.*)/ , '$2' )
${parameter/search/replacement} parameter.replace( /word/ , replacement )

マッチの順番と考え方

パターンに依るパラメータ展開に目を通したので、冒頭の記号だらけの置換処理を見直してみる。

拡張子にマッチさせたときの bash の展開の流れ

最初の例の拡張子にマッチさせたときのbash展開の考え方について

path=/etc/apache2/httpd.conf
extension=${path##*.} #=> conf
  1. /etc/apache2/httpd.conf場合
  2. /etc/apache2/httpd.conf は *.とマッチさせる
  3. [ '/etc/apache2/httpd.' , 'conf'] に分割される
  4. マッチした前方は消される
  5. conf が残る

basenameと同等の文字列マッチの場合の考え方

冒頭の basename を擬似的に文字列マッチで行った場合の例は

path=/etc/apache2/httpd.conf
basename=${path##*/} #=> httpd.conf
  1. /etc/apache2/httpd.conf場合
  2. /etc/apache2/httpd.conf*/と先頭から最長マッチさせる
  3. [ '/etc/apache2/' , 'httpd.conf'] に分割される
  4. マッチした前方は消される
  5. httpd.conf が残る

次と同等になる。

'/etc/apache2/httpd.conf'.replace(/(^.*\/)(.*)/,'$2')

dirnameと同等の文字列マッチの場合の考え方

冒頭のdirnameと同等の文字列マッチの考え方。

path=/etc/apache2/httpd.conf

dirname=${path%/*}
echo $dirname #=>/etc/apache2
  1. /etc/apache2/httpd.conf場合
  2. /etc/apache2/httpd.conf/*と末尾からマッチさせる
  3. /httpd.confがマッチする
  4. [ '/etc/apache2' , '/httpd.conf'] に分割される
  5. マッチした後方は消される
  6. /etc/apache2 が残る

次と同等になる。

'/etc/apache2/httpd.conf'.replace(/(^.*\/)(.*)/,'$1')

変数展開で文字列を分割する

これらは、パスやファイル名の扱いというよりは、bash変数の文字列から部分文字列を取出す基本セットです。

man によると他にも

記述方法 意味
${parameter:offset} 部分文字列 ( 開始位置 )
${parameter:offset:length} 部分文字列(開始位置から指定長)
${#parameter} 文字列長取得

他にどんなときに使えば便利?

今回はパスだったけど、起動オプションの引数や、PATH変数の操作などにも使えて便利ですね

sed 使わずに文字列置換できるのは本当に助かる

参考資料

bashスクリプトだけで、ファイル名、拡張子を取得する - 作業ノート

Man page of BASH

macOS のDNSキャッシュを消す専用コマンド

macOS X

macOSDNSキャッシュを消す

sudo dscacheutil -flushcache

BSD系のコマンドでのdns 関連もmacのFramework側に聞きに行ってるみたいなので、キャッシュを消すにはmac 専用コマンドを使う必要があるみたい。

さらにいえば、各アプリケーション側でキャッシュしてることもあるだろうし、コレだけで全て解決とは行かないかも。

まぁ専用コマンド使わなくてもネットワークオン・オフすりゃイイんだけどさ。

参考資料

https://discussionsjapan.apple.com/thread/10094319?tstart=0

Mac OS XでDNSキャッシュをFlushする方法 - 積み重ねた日々