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

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

bashで自爆カウンターめいたものをつくる

bashで自爆カウンターめいたものをつくる 実際のところ whileループでタイマーをぶん回してます。 #!/bin/bash i=666 while true do printf "\r0x%03X" i=$(expr $i + 1) done別パターン。 letのインクリメントを使います。 見た目からして明らかにコッチの…

Bash文字列のN番目を取り出す

Bash文字列のN番目を取り出す方法です。 軽量言語ならアリそうな機能ですが、まさかBashにもあったとは 実際のところ こんな変数を想定しておきます $ let sp="1234" 先頭一個だけ捨てる $ echo ${sp:1} 234 二番目を取り出す $ echo ${sp:2:1} 3 先頭3コを…

シェル変数文字列の長さを調べる

シェル変数文字列の長さを調べるには ${#VAL_NAME}です。 実際のところ 文字列を作って、その長さを調べます。 $ let sp="1234" $ echo $sp 1234ここまでは普通ですね。 ここで、上の方の通り変数名を中括弧で括ってシャープをつけたると…… $ echo ${#sp} 4…

【自習メモ】プログレスバー的な文字増減をする場合、先に全部生成してsedで弄ったほうが早い……こともある

timeコマンドはスクリプトの実行時間を計測する子です。 以前記事化した事もありましたね。さて、前回の記事でやったプログレスバーの部分について ちょっと前に読んだ本に「sedは十分高速だから極力sedでやれ」とか書いてあったような事を思い出し…… 試しに…

bashでプログレスバーを実装してみる

bashでプログレスバーを実装してみます。 実際のところ まぁ、考えてみればカンタンな話で……改行せずにガンガン上書きしてやりゃ良いだけですね。プログレスバーは昔の記事のyesを使うバージョンでやりました。 shuzo-kino.hateblo.jp #!/bin/bash function …

bashスクリプトの中で関数をつくる

自前のやっつけスクリプトも使用頻度が上がってくるとメンテしたくなるもの 半年後に見返した時、どこで役割が分かれてるかわかんないなんて悲惨なケースもありえますし というわけで、今回はbashスクリプト中で関数を定義する方法です 実際のところ #!/bin/…

cURLでレスポンスコードだけ見る

shuzo-kino.hateblo.jp 以前の記事では、レスポンスヘッダを丸々みる方法を紹介しました。ただ、状況によっては過剰でしょう。 実際のところ たとえば、example.orgというリンクが存在しているか確認したい場合です。 上記の記事通りやると以下のようなりま…

バイナリファイルをHEX文字化してローカルに保存

xxdコマンドをつかうと、バイナリファイルをHEX文字化することができます。 そのままファイルとしてローカルに保存する事も可能です。 実際のところ ここで大活躍するのがxxdコマンド。 $ xxd -p image.jpg | tr -d '\n' > dump.hexオプションpは以下にある…

Makefileの".PHONY"という記法について

実際のところ makeコマンドを使って、不要なtxtファイルを一掃するコマンド"clean"を作りたいとします clean: rm -r *.txtところが、このシステムにはとある事情でcleanという同名のファイルがありました $ ls Makefile clean hoge.txtこれでは、コマンドを…

【ネタ】"echo f o{,,} b a r"ってやったら、どうなると思います?

$ echo f o{,,} b a r f o o o b a r中括弧の中身を数値に変えると $ echo f o{2} b a r f o{2} b a r 奇妙な事に、man echoしてもこの構文に関する話は一切でてきません。 参考もと ……なんかもうこれでいいような気がしてきた。 echo す も{,,,,,,,} の う …

rbenv環境下でgem系に付随するツールが上手く動かないなら、.ruby-versionが悪さをしているかも……

今回もショーもない話ですが、結構ハマったのでメモpassengerには、諸々の設定を確認するツールがあります。 $ passenger-configところがぎっちょん、このツールが半端に認識されて上手く動きません。 sudoの権限でやってみろ等々のネットの指示を全部見ても…

CLI上に時間ごと天気図(気温、雨量、風向)を表示する

公的情報とfingerコマンドの合わせ技で、CLI上に時間ごと天気図(気温、雨量、風向)を表示する事ができます。Awesome: The Norwegian Meteorological Institute provides a CLI for weather reports.$ finger <city>@graph.no#fb pic.twitter.com/879CWw6m53— İhs</city>…

Shellスクリプトで特定の曜日/日付で発生する分岐をつくる

dateの結果を変数展開する事で、特定の曜日に発動する処理を作る事ができます。 cronなんかでは特に有用ですね。 実際のところ 月曜日の場合だけ「hello」と出すBashスクリプトは以下の通りです。 LANG=Cをしとかないと、日本語環境では動かなかったりするの…

shoptコマンドでbashの機能を拡張する

shoptコマンドはbashの秘められた性能を解放します。 実際のところ オプションなしでコマンドを実行すると、解放可能なもののリストが表示されます。 $ shopt cdable_vars off cdspell off checkhash off checkwinsize on cmdhist on compat31 off dotglob o…

extglobでBashスクリプトでも正規表現

extglobでBashスクリプトでも正規表現を実現できる拡張です。 実際のところ 読み込む前に $ shopt -s extglobとやると、extglobを有効にできます。これにより、「一個以上の空白」を実現したいならば +([[:space:]])とかいう気色の悪い記法を実現可能となり…

Bash用特殊変数$REPLYで空白を消す

“$REPLY”はreadコマンドなどで使うBash独自の特殊変数で、 $ while read; do echo “$REPLY”; done < textileのような感じで使います。 ちょっと変わった用途として、 $ while read REPLY; do echo “$REPLY”; done < textileとしてあげると$IFSが適用され 行…

環境変数を通さないと動くスクリプトも思った通りに動かない

導入したてのPCではありがちなポカで、今回まさにやらかしたのでメモ。bashを利用している場合、その環境変数は"bash_profile"か".bashrc"に保存されます。 より深いものに/etc/profileなんてのもあります。 GNU総本山によれば、 /etc/profile bash_profile …

sedで特定範囲のみに正規表現を適用する

sedで特定範囲のみに正規表現を適用する場合、 範囲を指定した上でいつものように正規表現をあてます。 実際のところ 101,Hyōgo,Takarazuka,"225,587","219,862",2.6,39.3,"5,740",Special city 102,Kanagawa,Atsugi,"224,426","222,403",0.91,36.2,"6,200",…

sedで最初と最後の行を表示する

$ seq 10 20 | sed -n '1p;$p' 10 20あたま数行を出したいだけなら、カンマ区切りで切れば良いです。 末尾数行ってのはやや苦しい感じです $ seq 10 20 | sed -n '1,3p' 10 11 12 参考もと sed -n '1p;$p' # Print the first and last line of stdin.— Comma…

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その7:grep

gr8のgrepメソッドはlazyでgrepコマンドとawkを合わせた挙動を同時に実行できます。 $ ls | gr8 'grep(/(.+)(\.png)$/) {|s| printf "cp %16s %16s", "#{$1}.png", "img/#{$1.upcase}.jpg"}' cp ceo.png img/CEO.jpg cp system_sol.png img/SYSTEM_SOL.jpg$ …

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その6:ライブラリの読み込み

gr8でも、Ruby製ライブラリを読み込むことができます。 ライブラリを読み込むには-rオプションです。 今回はgems.rbてな感じの名前でactive_supportと、自作メソッドを取り込んだファイルを作成します。 ## $ cat gems.rb require 'active_support' require …

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その5:クォテーション

出力結果にクォテーションを出したい場合、qメソッドか、qqメソッドをつかいます。 実際の所 qメソッド:シングルクォテーション $ cat data | gr8 -F "map{self[0].q}" 'Haruhi' 'Mikuru' 'Yuki' qqメソッド:ダブルクォーテーション $ cat data | gr8 -F "…

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その4:-Fで分割文字を

Fオプションをつかうと、分割文字を指定できます。 実際の所 $ cat data Haruhi!100 Mikuru!80 Yuki!120てな形にした場合、「-F"!"」てな感じで指定してあげます。 selfに配列形式で格納されています。通常のRuby配列の通り、0始まりです。 $ cat data | gr…

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その3:sumメソッドとavgメソッド

avgはカラムの平均を出すメソッドです。 $ cat data | grep -v "^$" | gr8 -C 2 'map(&:to_i).avg' 100.0この記法は、以下のようにショートカットができます。 $ cat data | grep -v "^$" | gr8 -C 2 'avg_i' 100.0平均があれば、合算のsumのあります。 $ ca…

AWKっぽい操作をRubyの構文でやるCLIツール「gr8」 その2:mapメソッド

gr8でのmapは1行分をselfとみなし、順繰りにぶん回すメソッドです。 gr8は内部的にRubyを使っているので……ブロックを渡す事も、&:でlambdaを渡す事ができます。 $ cat data | grep -v "^$" | gr8 -C 1 'map(&:downcase)' haruhi mikuru yuki実装はオリジナル…

jotコマンドではprintf記法が使える

jotコマンドでは"-w"オプションをつけてあげる事でprintf記法が使えます。 $ jot -r 5 10 20 | sed -e "s/\(.*\)/ \1 kByte/"上のようなコマンドが、次のように書き換わります。 $ jot -w "%d kByte" -r 5 10 20 11 kByte 15 kByte 18 kByte 13 kByte 14 kBy…

shufコマンドで行をランダムに散らす

shuffコマンドで行をランダムに散らすことができます。 OS Xの場合は、 OS Xのdateコマンドをぶん投げたくなったら、coreutilを入れて上書きしてしまうのも手 - Bye Bye Moore で取り上げたようにcoreutilを導入した上でgshufを叩けば使えます。 $ gshuf -i …

rsコマンドでカラムをまとめる

rsコマンドでカラムをまとめることができます。 実際のところ jotで100個の数をランダムに生成し、それを10×10の行列にする場合 $ jot -r 100 | rs 10 10 31 38 5 54 35 22 12 62 90 41 34 74 30 50 94 49 52 23 13 93 10 91 7 74 93 79 25 51 75 46 …

sedでグループ化にマッチしたモノは"\NUM"に入る

sedでグループ化にマッチしたモノは"\NUM"に入ります。 具体例 192.168.0.NUMという数値列を作る場合を想定します。 seqで1から9までの数値を生成し、sedで置換という手順で作ろうとすると以下のようになります。 $ seq 1 9 | sed -e "s/\([0-9]\)*/host 1…

Process Substitution(プロセス置換?)を使って、地獄の名前付きパイプや一時ファイルからサヨナラバイバイ

Process Substitution(プロセス置換?)は、ぱっと見リダイレクトっぽい構文の素敵テクです。 これを使えば地獄の名前付きパイプや一時ファイルからサヨナラバイバイ。 使い方 $ diff <(command1) <(command2) とやれば、コマンド間出力の比較ができます。 …

selectでBashでも対話型っぽいコマンドを実装可能

selectを使うと、Bashでも対話型っぽいコマンドを実装可能です。 実際のところ #! /bin/bash select type in "hoge" "fuga" do echo "You choose $type." done exitこれを実行すると $ bash sample.shell 1) hoge 2) fuga #?とでます。 試しに1を選ぶと #? …

軽い仕事のためにディレクトリ移動したくない場合、グループ化を起動させると楽

別の仕事を実行中、割り込み仕事が入るケースありますよね。 しかもディレクトリ移動しないと出来ないようなもの。いままでは新規タブ開いてやってましたが、 コマンド群を()で括ることでサブプロセスを起動する手があります $ ( cd /cygdrive/c/Users/SHU…

直前のコマンドの引数を継続してつかう

「!*」で直前のコマンドで使った引数を呼び出す事ができます。 $ echo "hello\n" hello\nとした場合、 $ printf !* printf "hello\n" helloと、一旦展開された後で、実行されます。 コマンド誤爆でも大活躍 これを活かせば、コマンドを誤爆した場合にもそ…

historyの番号を指定して実行する

historyコマンドを実行すると、こんな感じで「番号」「コマンド」という順番ででてきます。 $ history 10 558 basename `dirname hoge/huga/ruby.rb` 559 basename `dirname hoge/huga/ruby.rb` 560 history 561 basename `dirname hoge/huga/ruby.rb` 562 e…

bashでもcase文がつかえる

bashでも、caseが使えます。 たまにみかける、 if [ some_rule ]; then #something to do else #something to do fiを置き換えるにはちょうど良いかもしれません。 POSIX的にどうなのかは、調査中ですが…… 実際のところ 記法は以下のとおりです。 case word …

bashのfor文で規則性のある文字列をつくる

bashのfor文では、多重配列っぽいものを渡すことができます。 これを利用すれば規則性のある文字列をつくることが可能です。 実際のところ $ for n in {1..10}{a..f}; do printf "%03s\n" $n; doneというコマンドは 01a 01b 01c 01d 01e 01f 02a 02b 02c 02d…

Bashで海外の時刻を大雑把に知る

副業で海外と取引をしているのですが、 その時に何かと問題になるのが先方の時間帯。 下手な時間に反応するのもあれですし、 目を血走らせて深夜にきた返信を即レスしたら向こうはとっくに帰宅してた…とか。そういう時は、軽く先方の時刻を知っておくと楽に…

bashコマンドに文字列を渡すと実行してくれる

任意の出力結果をパイプでbashに渡してあげると、 それが解釈可能である場合実行してくれます。例えば、echoで「cal」と出し、それを繋ぐケースでは…… $ echo 'cal' | bash 12月 2014 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19…

オプションとpstopdfコマンドを使ってmanの結果をpdfに書き出す

manコマンドにもオプションがあります。 このうち、"-t"オプションは標準出力にmanの結果を書き出す子です。 -t Use /usr/bin/groff -Tps -mandoc -c to format the manual page, passing the output to stdout. The default output format of /usr/bin/grof…

カンマ区切りの文字列を配列に切り分けて処理する

カンマ区切りで複数行あるテキストファイル...たとえばcsvみたいなものを切り分ける方法です rubyのsplitみたいな感じで配列に切り分ける方法です $ head sample.txt hoge,huga,piyo foo,bar,bazz 1,2,3read -aをwhileでぶん回して配列にツッコみます。 ...U…

Bashスクリプトを使って溜まりに溜まったローカルの不要branchを消す

リモート開発をやっていると、不要ブランチが出て来ます。 こまめに消していれば良いのでしょうが、修羅場ではそうも言っていられません。 と、いうわけで、今回の記事では不要ブランチを綺麗にするbashスクリプトを紹介します。 $ for var in `git branch |…