Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

unix

標準出力に出したzipやgz系の圧縮ファイルをパイプで処理したい場合、funzipが使える

一応、標準出力にもzipやgz系の圧縮ファイルを表示する事はできるのですが…… $ cat sample.txt )r?Usample.txt ??,V??J???t.????T????T??[Qb^?BUZfq??*?????Te???%?9?$??qq2?a?t……まぁ、あたり前のように解読不能です。 これを解答するためunzipに渡しても………

特殊変数「$RANDOM」から乱数を得る

特殊変数「$RANDOM」から乱数を得る事ができます。 $ echo $RANDOM 8487 応用:文字列のランダム化 これを応用すると、文字列をランダムでかき乱す事ができます。 $ for i in big brother is watching you; do printf "$RANDOM $i\n"; done | sort | sed -E …

kill -9 の9はSIGKILLという意味

「kill -9」といえば、強制終了の定番コマンドです。 今日の今日まで、この9てのは一体なんなのか把握していなかったのですが…… これはSIGKILLというシグナルの番号なのだそうです。 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIG…

プロセス置換をつかって、ファイル内容の先頭と末尾3行の情報を表示する

どうも上手い手では無い気がしますが、できたので一応……catでまとめてファイルを読む機構を生かしつつ、bashの特殊変数をつかって表示する形式です。変数に突っ込んでもいいのですが、なんか釈然としないので…… 実際のところ bashの特殊変数”$_”をつかって最…

nlコマンドを使うと、ファイルに行数がついてくる

ちゃんと設定されたエディタだと、行番号が左側についてたりしますよね。 ただ、デフォのcatやlessではないのが実際。 そんなときは、nlコマンドを使うと楽できます。 パイプを通すので、他のツールとの連携も楽々。 使い方 なにも指定しなければ、左側に行…

名前付きパイプをつかう

名前付きパイプはファイルシステムを活用し仮想敵なパイプ処理を実現する機構です。 使い方 mkfifoコマンドで作成します。 $ mkfifo /path/to/pipe $ ls -la pipe prw-r--r-- 1 shuzo_kino staff 0 4 25 11:43 pipe $ file pipe pipe: fifo (named pipe)ファ…

zcatやzlessを使ってgz系で圧縮されたファイルの中身をみる

zcatやzlessを使うと、gz系で圧縮されたテキストファイルの中身をみる事ができます。前回の記事で扱ったような、Wikipediaのベトナムに関するページの圧縮ファイルがあったとします。 $ tee >(wc -l >&2) < vietnam.html | gzip > vietnam.gz 3638実は、テキ…

プロセス置換の出力先はデフォで標準出力

Wikipediaのベトナムに関するページを圧縮する仕事があったとします。 その上、どういうわけか、ファイルの行数を知りたいそうです。個別にコマンドを叩いてもいいですが、ここはプロセス置換で楽をしましょう。 やり方 プロセス置換の枠内で、wcの出力先を…

tar.gzの正体と、その作り方

UNIX系を弄っていると、よく遭遇するのがtar.gzだのtar.bz2だのといった圧縮ファイルです。 なんで拡張子が二個並んでるんだ? と思ってましたが……tarは梱包しかやらないそうで*1、圧縮したい場合更にgzipなりで固める必要があります。 とはいえ……まとめて、…

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を選ぶと #? …

プロセス間で文字列の受け渡しをしたい場合、/proc/$(PID)/fd/$(NUM)が使える……かも?

/proc/$(PID)/fd/$(NUM)とは…… PIDに繋がってるI/Oに対し文字列を流し込む超絶技です。 0は標準入力、1は標準出力、2は標準エラー。3以降は設定していれば別途使えます。 実際のところ 標準入力から文字を受け取って処理、終了するsort.rbというスクリプト…

pidofで、コマンド名から稼働中のプロセス番号がわかる

pidofは、コマンド名から稼働中のプロセス番号を調べることができるコマンドです。 $ pidof catとやれば、 7143てな感じでプロセス番号がわかります。複数のコマンドについて実行も可能です $ pidof ruby cat 21528 21465 21527 21464 インラインで実行もで…

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

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

Grepの「-o」オプションを活用し最後に一致した要素だけ出力する

先日の最後の要素を引っ張り出す事例をGrepの魔法を使って書き直すと $ echo http://s3.amazonaws.com/downloads.basho.com/stanchion/1.5/1.5.0/osx/10.8/stanchion-1.5.0-OSX-x86_64.tar.gz | grep -o '[^\/]*$'となります。oオプションは -o, --only-matc…

cutとrevの組み合わせでURLの最後の要素だけ引っ張り出す

revは*NIX標準添付の、文字列をひっくり返すコマンドです ~$ echo http://s3.amazonaws.com/downloads.basho.com/stanchion/1.5/1.5.0/osx/10.8/stanchion-1.5.0-OSX-x86_64.tar.gz | revが、 zg.rat.46_68x-XSO-0.5.1-noihcnats/8.01/xso/0.5.1/5.1/noihcna…

「docopt」を使えばgithubやherokuのCLIツールみたいなUIをドキュメント駆動開発で実装できる。

Julliaとか聞いたこともない珍しい言語もサポートdocopt/docopt.rb · GitHub と、Rubyも対応はしているのですが docopt has been confirmed to work with 1.8.7p370 and 1.9.3p194. If you have noticed it working (or not working) with an earlier versio…

YAMLをコマンドでパースできるツール「yq」

ちょっと前に、JSONをパースしてくれる便利コマンド「jq」を紹介しました。CLI上でjsonパースをしてくれるjqを使えばワンライナーが不要となる - Bye Bye Moore今日散歩中にフと、あの発想でYAML版つくれないかな……と思い検索をかけたところ…… あ、ありまし…

xmllintでCLIでもXMLをパースする

OSXやUbuntuのような*NIX系には、xmllintというXMLをパースする便利なツールがついてます 実例 $ echo '<foo><bar/></foo>' | xmllint --xpath "//foo" - <foo><bar/></foo> XPath Xpathに対応しているため、局面によっては便利につかえることもあります $ xmllint --xpath '//a/@href' vietna…

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

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

N個前のコマンドを実行する

N個前に実行したコマンドを再度実行する事ができます。 たとえば、次のような状態の場合 $ history 3 594 echo 'fuga' 595 echo 'yeah' 596 history 3「!-戻りたい個数」と入力すると、実行可能です。 $ !-3 echo 'fuga' fuga履歴には、次のように展開した後…

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…

basenameでファイル名を楽に取得する

basenameは「/」や拡張子を削除し楽にファイル名を取得できるコマンドです 現在いるディレクトリ名を取得 $ basename hoge/huga/ hugaファイル名を含んだパスの場合*1 $ basename `dirname hoge/huga/ruby.rb` huga ファイル名を取得 $ basename hoge/huga/r…

bashでもcase文がつかえる

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

dirコマンドをつかうと、「~/」からの位置がわかる

現在位置を調べる場合、 $ pwd /Users/shuzo_kino/ruby/sampleという手が使えます。 ただ、これだと人に渡すとき色々アレな事もありますよね。 そんな時はdirsコマンドを使います。 $ dirs ~/ruby/sampleこの通り、ホームディレクトリを示す「~/」にして位置…

標準出力に表示しつつ、結果をファイルに保存したい場合は「tee」コマンドをつかう

標準出力に表示しつつ、結果をファイルに保存したい場合は「tee」コマンドをつかえばよいです。 $ cal | tee cal.log 3月 2015 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 保存先のファイ…

UNIXコマンド「test」が思ったより使える件

一般に、「test」はファイルが存在するか確認する際に使われるコマンドです。 結果は標準出力ではなくコマンドの終了状態に格納されるため、注意が必要です。 $ test -e aasm_sample.rb ; echo $?とまぁ、これ単体だとイマイチありがたみがわかりませんが 設…

dfコマンドでディスクの使用量や残り容量を見る

dfコマンドは、ディスクの使用量や残り容量を確認できるコマンドです。 $ df ~/ Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda6 102226264 6255524 90777884 7% /"h"オプション(human-readable)をくっつけると、人が読みやすい形に成型…

UNIXコマンドのあたまにLANG=Cでデフォルトロケールで実行できる

たまに、 LANG=C minicomみたいな感じで頭に「LANG=C」とかつける奴がありますよね。 これ、デフォルトでは日本語優先状態のコマンドをデフォルト…つまり英語環境で実行してくれるアレらしいのです $ date 2015年 1月27日 火曜日 23時50分39秒 JST$ LANG=C d…

rfcommをつかって、Bluetooth機器をシリアル通信機器のごとく扱う

rfcommは遠隔にあるBluetoothを仮想シリアルポートとして認識させるコマンドです。 より正確には、 Bluetoothのプロトコルスタックの一つで、L2CAP(メモ:Bluetooth機器間の通信路。OSIの第二レイヤに相当)上でRS-232Cシリアルポートの転送機能をエミュレ…