[[コマンドの正規表現(後方参照と文字クラス)

bashの[[コマンドでは正規表現を使用できる。正規表現にマッチした部分は後方参照できる。正規表現にはPOSIX形式の文字クラスを指定できる。

[[コマンド

[[コマンドは、多くの場合ifと組み合わせて条件判断に使用されます。この[[コマンドは、[コマンドのただ等しい・大小比較だけではなく=~で正規表現にマッチするか調べられます。

$ [[ "abcdefg" =~ ^abc ]] && echo TRUE
TRUE

正規表現の後方参照

正規表現にマッチした部分は、変数BASH_REMATCHに代入されます。

$ [[ "a1234b" =~ [0-9]+ ]] && echo ${BASH_REMATCH}
1234

変数BASH_REMATCHは配列変数で、添字を指定することで対応する括弧の部分を取り出すことが可能です。

$ [[ "a1234b" =~ a([0-9]+)([a-z]) ]] && echo ${BASH_REMATCH[@]}
a1234b 1234 b

正規表現に文字クラスを使う

正規表現には、文字クラスも使用可能です。ただし次のような制限があります。

  • 文字クラスは選択[]内でのみ使用できる。
  • Perl系の表記方法(例えば数字を表す\d)を使用できない。代わりにPOSIXの表記方法(数字であれば[:digit:])を使用する。
$ [[ "a1234b" =~ a[:digit:]+b ]] || echo FALSE
FALSE
$ [[ "a1234b" =~ a[[:digit:]]+b ]] && echo TRUE
TRUE
$ [[ "a1x2y34b" =~ a([[:digit:]xy]+) ]] && echo ${BASH_REMATCH[1]}
1x2y34

POSIXの主な文字クラスは次のようになります。

文字クラス Perl系 意味
[:digit:] \d 数字
[:xdigit:] \h(Ruby) 16進数での数字
[:alnum:] \w(\wは_を含む) アルファベットと数字
[:space:] \s 改行を含む空白

参照

「らじる★らじる」をrtmpdumpで録音する

「らじる★らじる」はrtmpdumpコマンドを使用すると簡単に録音できる。rtmpdumpで録音したファイルは、ffmpegコマンドでMP3に変換する。

たまたまNHKのラジオドラマ(オーディオドラマと今は呼ぶらしい)を聞いて、それ以来NHKのラジオドラマを気に入ってしまいました。ラジオドラマは、テレビと違って目を使う必要がないのでご飯を食べながら楽しむのにちょうど良さそうです。

しかしNHKラジオのネット放送「らじる★らじる」radikoと違って放送を後から聞くことができません。そこで「らじる★らじる」を録音して好きな時間に聞けるようにしました。これでNHKのラジオ語学講座も一週間遅れでの配信を待つ必要がなくなります。

「らじる★らじる」の録音

「らじる★らじる」の放送を録音するには、rtmpdumpコマンドを使用します。録音したファイルは、ffmpegコマンドでMP3ファイルに変換します。

インストール

rtmpdumpコマンドのインストールは、Ubuntuでは次のように簡単に導入できます。同時にMP3に変換するffmepgコマンドとID3タグを編集・表示するeyed3コマンドをインストールしておきます。

$ sudo apt install rtmpdump
$ sudo apt install ffmpeg eyed3

録音方法

「らじる★らじる」の放送を録音するrtmpdumpコマンドの肝は指定するオプションです。そこでもう何も考えずにriocampos/らじるらじるをrtmpdumpで録音する(仙台・名古屋・大阪も)を参考にさせてもらいます。

ファイルをMP3に変換

rtmpdumpはMP3よりも高圧縮なMPEG4 Audio(M4A)形式で録音しますが、私の音楽プレイヤがサポートしていないようなのでffmpegコマンドを使って一般的なMP3形式にトランスコードします。必要であればビットレートの指定などもffmpegコマンドのオプションで指定できます。

$ ffmpeg -i nhk.m4a -acodec libmp3lame nhk.mp3

MP3ファイルにID3タグを登録

ID3タグはffmpegコマンドにmetadataオプションを指定することで登録できます。複数のタグを指定する場合は、metadataオプションを必要なだけ追加します。

$ ffmpeg -i nhk.m4a -acodec libmp3lame -metadata "artist"="らじる ★ らじる" nhk.mp3
$ eyeD3 nkh.mp3
nhk.mp3	[ 469.47 KB ]
-------------------------------------------------------------------------------
Time: 01:00	MPEG1, Layer III	[ 64 kb/s @ 48000 Hz - Stereo ]
-------------------------------------------------------------------------------
ID3 v2.4:
title: 		artist: らじる ★ らじる
album: 		year: 
track: 		
Publisher/label: 

たくさんのID3タグがありますが、今回は次のタグ(metadataキー)を使用しました。

metadataのキー 意味
album アルバム名(番組名)
artist アーティスト名(らじるに固定)
title タイトル(放送日)
publisher 出版社名(放送局)
date 出版年(放送年)

「らじる★らじる」を録音するシェルスクリプト

以上のコマンドをまとめて「らじる★らじる」を録音するシェルスクリプトを作成しました。このスクリプトを使えば、次のようにcrontabに設定することでNHKのラジオドラマを自動的に録音してMP3ファイルに変換することができます。

45 22 * * 1,2,3,4,5 rec-radio.sh fm 15m 青春アドベンチャー
0 22 * * 6 rec-radio.sh fm 50m FMシアター
20 19 * * 0 rec-radio.sh r1 30m 新日曜名作座

ログファイルへの書き込みを追いかける

目標

ログファイルに処理記録が書き出される時に、追加された書き込みを見守りたい。

方法

ファイルに追加された書き込みを追いかけるには、tailコマンドに-Fオプションを付けて使用します。

$ tail -F logfile

これで追加された書き込みが標準出力に表示され続けます。

tailコマンドには似たオプションの-fがあります。これも同じく追記された部分が表示されますが、ログローテートなどでファイル名が変更された時の動作が異なります。

オプション ファイル名が変わった時の動作
-F 同名のファイルを開いて追記を追いかける。
-f そのまま追記を待ち続ける。

ログを追いかけている時にファイル名が変わるのは大抵ログローテートによるものなので、新しいログファイルを開いて追記を追いかけれれる-Fオプションを使うことになります。

lessコマンドもある

ログの追記を見守りたいが、同時に過去の書き込みも遡って読みたい時にはlessコマンドが便利です。

$ less logfile

Gキーを押すと常にファイルの最後が表示され、再度Gを押すとその時の最後に更新されます。

そしてFキーを押すとtail -fと同じくファイルに追記されるたびに更新されます。ただし追記から更新までのタイムラグがtail -fよりも少し大きくなります。また-fオプションと同じなので、ファイル名が変更されても同名の新しいファイルには自動では切り替わりません1

脚注

  1. lessのコマンド入力モードでhキーを押してヘルプを表示させれ戻ると、開いていたファイルと同名の新しいファイルの内容が表示されます。逆に元のファイルに戻りたい時にはどうしたら良いのか?