min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash radiko参加局一覧から、参加局のID(識別子)だけを抜き出す

 

前記事の続き。

RaspberryPi 3 でradiko受信してテレビ画面でラジオを聞く - min117の日記

radikoの参加曲一覧を掲載したサイトが以下にあり。

radikomemo - foltia - Trac

f:id:min117:20160910174036p:plain

Linuxradikoを再生する時には、ここからradiko.shをダウンロードして、

# sudo wget https://gist.githubusercontent.com/soramugi/836952a6b09e540eb6a3/raw/81182ff0a1f5003077a479e0e947b66fb5d3b99e/radiko.sh

引数として、-p(再生モード)を指定し、さらに上記一覧の最右列にあるID(識別子)を与えて実行すればいい。例えばラジオNIKKEI第1放送の再生なら

$ ./radiko.sh -p RN1

とするだけ。ここまでは前回の話。

ーーー

今回は、上記一覧からID(識別子)だけを取り出したい。一覧をtxtにコピペして、空白を全てカンマ区切りにしたのが以下「radiko参加局一覧.txt」

f:id:min117:20160910174729p:plain

ここから、カンマ区切り最右フィールド「RN1、RN2…」だけを取り出す。awksed使えば一発でできる。

$ cat radiko参加局一覧.txt | awk -F, '{print $3}' | sed '/^$/d'

sed で空白行を消してるのがミソ。^$ は空白行をつかまえる。d でdeleteしてる。

ーーー

取り出した結果。

f:id:min117:20160910175348p:plain

そのテキスト

ID(識別子)
RN1
RN2
HBC
STV
AIR-G
IBC
TBC
FBC
TBS
QRR
LFR
Inter
TOKYO
FMJ
IBS
JORF
BERRY
BAYFM78
NACK5
YFM
FMGUNMA
BSN
NIIGATA
PORT
KNB
FMTOYAMA
ABC
MBS
OBC
FM
802
FM
FM滋賀
KBS
FM京都
FM
CBC
GBS
ZIP-FM
CUBE
AICHI
HFM
RKB
KBC
FM
FUKUOKA
SBS
SHIZUOKA
SBC
FMN
MRO
MBC
FBC
BSS
RNB
NBC
FMNAGASAKI
RKK
FMK
OBS
FM_OITA
MRT

ーーー

awksed。最高だ。

 

bash タスクの実行状況確認(ps aux をカスタマイズ/ワンライナーで)

 

bashでラジオの録音スクリプトを組んだ。rtmpdumpで録音して、ffmpegでmp3にする。実行状況をモニタリングしたい。使い捨てのワンライナー

for i in `seq 1 10000`; do if "$i" -le 10000 ; then ls; ps aux | egrep 'rtmp | ffmpeg'; echo "$i"; sleep 2; clear; fi; donelea

f:id:min117:20160910161156p:plain

sleep 2 のあとにclearで画面更新を入れてるのがミソ。if文は要らないのかもしれないけど、一応。

実行結果

2秒ごとに更新される。

f:id:min117:20160910160635p:plain

www-data(実行者)の横にある11547(PID)が刻々と変わるのと、左下の17(カウント回数)が1ずつあがっていくので、実行されているのが分かる。

 

 

bash シェルからcurlでPHPを叩く

 

fedoraサーバにあるrecHTTP.phpファイルにGETで引数を投げてやると、「録画プロセスrecpt1が起動しているか」を判定して返すようにしてある。

いつもはブラウザから実行してた。

f:id:min117:20160907233855p:plain

これを、RaspberryPiやMacのシェル(bash)上からコマンド実行できるようにしたい。curlで出来るかなと思って調べたら、ものすごい簡単にできた。

$ url="http://192.168.1.1/phpファイル名?引数

$ curl $url

これだけ。スクリプトにしてみる。

bashからPHPを叩くスクリプト

f:id:min117:20160907234047p:plain

これで、例えばMacのローカルでスクリプト実行すれば、fedoraサーバ上のphpを叩ける。ものっそい便利。もっと早くやっとけばよかった。

bash Linuxシェルと同じことをWindowsバッチでやる

Linuxシェルは毎日の生活になっているので普通に使ってたけど、ここにきて仕事でWindowsバッチを書くことが多くなった。両方で同じことをしたい。

 

 

 

今いるフォルダの一覧を取得する(lsと同じ)を、bashWindowsバッチと両方でやってみる。

Linux bashの場合(ls.sh)

$ for i in *; do echo "$i"; done

Windows バッチの場合(ls.bat)

for /F %i in ('dir /b') do @echo %i

f:id:min117:20160907230054p:plain

バッチの中で正規表現も使えたりする。

Linux

$ for i in *{txt,log,sql}; do echo "$i"; done

Windows

for /F %i in ('dir /b ^| findstr /r ".*txt | .*log | .*sql"') do @echo %i

注意点

 バッチのdir /b をパイプしてfindstrに渡すときは、パイプの前にキャレット^が必要らしい。しかしfindstr /r の引数にくる文字列の中で(orの意味で)パイプを使うときはキャレットは不要

f:id:min117:20160907231028p:plain

サラッと書いて動くのはいいけど、やっぱDOSバッチには限界がある。PowerShellで書くとさらに面倒で、どうしたってワンライナーって気にはならない。Linux版のPowerShellなんてのも出始めたようだけど、そんなの使うよりはbash使うよね…

おまけ

 Windowsで書いたShift-JISなbatファイルをLinuxで開くと文字化けする。Shift-JISをUTF8に変換する一番確実なnkfのオプションは「-wLux」。

$ cat win.bat | nkf -wLux

-w UTF8にする

-Lu 改行をLinuxのもの(LF)に統一する

-x 半角カナを半角カナのままにする。

 

bash sedを使って文字をタテにして短冊にする

 

bashいじればいじるほど面白い。GNU sedでは変換後の文字として改行を指定できるらしい。

$ echo 文字をタテにして短冊にするテスト | sed 's/./&\n/g'

任意の一文字(ドット)を、アンド記号( )がそのまま受けとって、そのあとに改行( \n )を付加している。

f:id:min117:20160831214151p:plain

パイプで流れてくる文字1つ1つの後ろに改行が付き、結果、タテの短冊になる。

bash テレビを音楽プレイヤーにする

RaspberryPiの/volumes/mp3 にマウントしたフォルダにある大量のmp3から、指定した単語を含むファイルを検索して、テレビで音楽再生する。

ソース

$ vim mymp3z.sh

f:id:min117:20160827235735p:plain

コツ

 26行目…IFSを空白以外に指定している。これやらないと、ファイル名に空白を含んだmp3がうまく再生できない。

 27行目…find コマンドは -or オプションで複数の条件検索が可能

ーーー

実行してみる。

$ ./mymp3z.sh

f:id:min117:20160828000026p:plain

 

bash manコマンドを引数manで実行する

 

コマンドの後ろの数字がマニュアルの章を表すのは知ってるけど…1章と3章のどっちがシェルコマンドで、どっちがライブラリだったか。すぐ忘れる。

 scanf(1) 1章記載…シェルコマンドとしてのscanf

 scanf(3) 3章記載…C言語の関数としてのscanf(プログラムライブラリーに含まれる関数)

ーーー

manコマンドでmanを見れば分かるらしい。初めて知った。

$ man man

f:id:min117:20160827211542p:plain

こりゃ便利。

f:id:min117:20160827211547p:plain

man が英語のときは、インストールで日本語にできるみたい。

$ sudo apt-get -y install manpages-ja