ぼけーっと調べ物していたところ、パイプで渡した内容をWeb上にペーストしてくれる『seashells』なるサービス・ツールを見かけたので、ちょっとお試し。
ncで1337ポートにポストするだけでもいけるようだが、クライアントプログラムも用意されているらしい。pipでインストールできる。

pip install seashells

後は、以下のようにコマンドを実行してやればその実行結果をそのままペーストしてくれる。 クライアントプログラムの場合、teeのようにPOSTしつつ標準出力にも出してくれるらしい。

コマンド | nc seashells.io 1337
コマンド | s...

なんとなく、テキストからモールス信号生成したらノートPCあれば無人島でもやってけそうだなとかアホな事考えてたのだが、世の中には受け付けた標準入力をビープ音を使ってモールス信号にしてスピーカーから出力してくれる『cw』コマンドなるものがあるらしい。 (知らんかったわ…) スピーカーが付いてないと動作しないようなのだが、Ubuntu 16.04であればaptからインストールができる。


ボケーッと調べ物をしてたところ、curlからPOSTした文字列をAAのQRコードにして返してくれる『qrenco.de』なるサイトを見かけた。 つまり以下のようなコマンドを実行すると、パイプで渡した文字列をQRコードにして返してくれる。

echo -e ''$_{1..20}'\bうっほっほ' |  curl -F-=\<- qrenco.de

第30回シェル芸勉強会に行ってきたので、その復習。

問題、解説はこちら。 今回は、前半の問題は対象の知識があるかどうかに重きを置いていた様子。 後半はいつものような内容の問題だったので、個人的には後半のほうが取っ付きやすい印象だった。

Q1.

特定ディレクトリ配下から、「main.md」ファイルのみを対象に2行目の「Keywords:」行を抽出するという問題。 最初、2行目のみを抽出するためにawkを利用する方法を取っていた。

find ./posts/ -name main.md | xargs grep -n Keywords | awk -F: '$2==2{OFS=...

個人的な興味から、GPUを利用したハッシュ解析ツール『hashcat』をインストールしてみたので、その備忘。 Ubuntu Desktopの場合だとaptからインストールが可能(ドライバ等に関してはまた別途インストールが必要)だが、Ubuntu Serverの場合はコンパイルをする必要がある。 まず、以下のコマンドでコンパイル用のパッケージを導入する。

sudo apt update
sudo apt install cmake build-essential checkinstall git

パッケージの導入後、以下のコマンドでソースからコンパイルを行う。

git clone h...

コンソール上で、IPアドレスをバイトで表記させる処理をワンライナーで記述したので備忘として残しておく。 以下のように、パイプで受けた後にbcコマンドで2進数に変換してやればいい。桁数をあわせるためにprintfを使っている。

echo 192.168.0.122|xargs -d. -n1 -I@ sh -c 'printf "%08d." $(echo "obase=2;@"|bc)'|sed 's/.$/\n/g'

ふと、コンソール上で2進数とかExcelの列の10進数対応一覧みたいなのを一発で出力できないかなと思ったので、やってみることにした。 2進数については、bcコマンドを使うかどうかで結構変わってくる。 bcコマンドを使わない場合だと、ブレース展開を使用するので明示的に数字を指定するのが難しいようだ。

seq -f "obase=2;%g" 0 255|bc|awk '{print (NR-1),$1}'
eval echo $(echo '{,{0..1}}'{,,,,} '{0..1}'|tr -d ' ')|tr ' ' '\n'|awk '$1!~/^0{2,}$/&&!a[$1]++...

Ubuntuで、パッケージのアップグレード時に適用されるバージョンを得る場合、aptコマンドを実行して取得するといいらしい。(sudo権限なしでも実行可能) パイプでまたぐと、「まだCLIツールとしては未完成だからスクリプトで使うときは注意しろ」という内容のstderrが出力されるので、grep等と組み合わせる場合は「2 > /dev/null」を追記した方が無難。

apt list --upgradable

残念ながら、bashのブレース展開では「echo -e {あ..ん}」といった指定ではひらがなの一覧を出力できない(zshでは可能)。

blacknon@BS-PUB-UBUNTU-01:~$ bash -c 'echo -e {あ..ん}'
{あ..ん}
blacknon@BS-PUB-UBUNTU-01:~$ zsh -c 'echo -e {あ..ん}'
あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ...

ちょっとした処理で、特定範囲の16進数の一覧が必要になったので、その備忘。 以下のように、printfでフォーマットを指定してやることで、範囲内容の16進数を取得可能だ。 2桁であれば255、3桁以降なら4095、65535と乗算する数-1を桁数に合わせて範囲指定すればいい。

printf '%02x\n' {0..255} # 範囲、桁数をそのまま指定
(i=4 && echo printf "'%0"$i"x\n'" {0..$(( 16 ** $i - 1))} | bash) # 桁数を変数に入れて指定

コンソール上で特定の文字列をワンライナーで指定回数リピートさせたい(例えば、0を10回リピート等)ということがあったので、備忘で残しておく。 いくつか方法があるようなので、それぞれ分けて残しておく。

1. ブレース展開を利用する

真っ先に利用する方法として思いつくのはブレース展開だと思う。 ただ、以下のように普通にechoにくっつけて利用すると展開時にはスペース区切りになってしまう。

echo 0{,,,,,}
blacknon@BS-PUB-UBUNTU-01:~$ echo 0{,,,,,}
0 0 0 0 0 0

一応、前にブレース展開の出力区切り文字を変更するの...


調べ物中、いい感じにCPU使用率を棒グラフにして出力してくれるモニタリングツール『s-tui』なるものを見かけたので、試しにUbuntu Server 16.04 LTSへインストールしてみる。 Pythonで記述されており、pipからインストールができるようだ。

sudo pip install s-tui # sudoで実行する場合
pip install s-tui --user # user権限で実行する場合

sedでは、以下のようにn個目のキーワードのみを置換といった指定ができる。

※ nはn個目の箇所を数字で記述
sed 's/before/after/n'
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x'
AxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZ
blacknon@blacknon-ThinkPad-X201:~$ 
blacknon@blacknon-ThinkPad-X201:~$ # 3個目を置換
blacknon@blacknon-ThinkPad...

Qiitaでそんな感じの内容を見かけたので、awkでもできるんじゃないかと思ったのでやってみた。
特に難しいこともなく、gsubで削除するだけでいけるかと思ったが、ただ削除するだけだと「0」が消えてしまうのでNG。

awk '{gsub("^0*","",$n);print}' # 特定の列のみ対象
awk '{for(i=1;i<=NF;i++){gsub("^0*","",$i)};print}' # 全列を指定
blacknon@BS-PUB-UBUNTU-01:~$ cat pad.list
a01 00961 00046
a02 00127 00001
a03 00323...

ネットで調べものをしていたところ、『gtop』なるNodejsで書かれたモニタリングツールを見かけたのでちょっと試してみる。 Nodejsで書かれているので、npmコマンドからインストールができる。

# CentOSの場合
yum install epel-release
yum install nodejs
npm install gtop -g

# Ubuntuの場合
sudo apt install nodejs-legacy npm
npm install gtop -g


ふと、PowerShellでMac OS Xのsayコマンドのようにテキストを合成音声で読み上げさせることができないかと思い調べてみたところ、Add-Typeで.NetのSpeechSynthesizerを追加したらできそうだったので、試しにやってみることにした。 なお、OSはWindows 10を用いている。


ぼけーっとネットサーフィンしていたところ、標準入力などで受け付けた内容を一度暗号化した状態っぽく表示して、その後ジワジワと平文で出力してくれる『No More Secrets』なるえらいかっこいいツールを見かけたので、Ubuntu上で試してみる。

1. インストール

以下のコマンドでgitからソースを取得し、コンパイルをする。

git clone https://github.com/bartobri/no-more-secrets.git
cd ./no-more-secrets
make nms
make sneakers
sudo make install

これでイン...


ふと、ターミナル上で短歌っぽい横書きの文章を縦書きにして表示させることができないかなと思ったので、ちょっとやってみることにした。 rsコマンドがあるとある程度短く書けるのだが、それがないとちょっと長くなってしまった。 一番最初の行が最も長い行の場合、rsコマンドでスペース埋めができるのでちょっと短く記述できる。

rsコマンドを使った場合

# 最初の行が一番長い行ではない場合
echo -e 'あいうえお\0\0かきくけこから\0さしすせそ\0'|xargs -n1 -0 -I@ printf "%-21s\n" @|sed 's/ \{3\}/x/g;s/\B/,/g;s/x/ /g'...

凄まじくどうでもいい内容なのだが、Mac OS Xのsayコマンドを複数実行させる場合、以下のように()でグルーピングしてバックグラウンドですると行える。

(say xxx &)

つまり、数秒の間をあけて連続で喋らせるのであれば、以下のようにすればいい。

yes '(echo ソイヤソイヤ|say &);sleep 0.3'|head -500|sh

応用例は以下。
あまり聞いてると気が狂いそうになるので程々...


ふと、コンソール上でアスキーアートでフロー図を作成する方法ってあるのかなと調べてみたところ、vim以外だと2つほど見かけたので記述してみる。

1. groffを用いる

manページの作成などに用いられるgroffを用いることで、roffのフォーマットを使ってアスキーアートでフロー図を簡単に生成できるらしい。 以下、実行例。

blacknon@BS-PUB-UBUNTU-01:~$ cat ascii.roff
.PS
box "box1";
line
box "box2";
.PE
blacknon@BS-PUB-UBUNTU-01:~$ groff -T ascii -p asc...

ちょっとテキストファイルをいじってたところ、以下のようなファイルがあった。

blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
a01 a02@aaa.com a03 a04 a05
b01 b02 @bbb.com b03 b04 b05
c01 c 02 @ccc.com c03 c04 c05
d01 d02@ddd.com d03 d04 d05
e01 e 0 2 @eee.com e03 e04 e05

空白区切りのファイルなのに、ダブルクォーテーション等で囲みもせずに、文字列内に空白を含めているようなファイル。 このようなファイルから、2...


あまり写真とか撮らないのだけど、ふとLinuxのコンソール上で画像データのEXIF情報を取得するにはどうすれば良いのかなと思ったので調べてみたところ、ImageMagickを使ってやることで、コンソール上からファイルのEXIF情報を取得・削除といった事が可能なようだ。 ImageMagickは、CentOSならyum、Ubuntuであればaptからインストールができる。

sudo apt install imagemagick
sudo yum install ImageMagick

EXIF情報を確認する

インストール後、以下のコマンドでファイルのEXIF情報を取得することができ...


パイプから受け付けた内容を変数に入れる場合、以下の2パターンが考えられる。

1. readを用いる

普通にwhileなんかで使うように、readを使って代入をする。 この際、{}や()でグループ化をする必要がある。

echo ABC | { read v ;echo -e "$v"_TEST; }
echo ABC | (read v ;echo -e "$v"_TEST;)
[root@BS-PUB-CENT7-02 ~]# echo ABC | { read v ;echo -e "$v"_TEST; }
ABC_TEST
[root@BS-PUB-CENT7-02 ~]#...

bashのprintfで文字列をセンター寄せしたいということがあったので、備忘で残しておく。 残念ながら、以前調べた際にわかったこととしてbashのprintfの機能として、センター寄せは用意されていないようだということ。

なので、ちょっと野暮ったいけど、以下のようにprintfに渡す際に幅を1/2して出力させることで、真ん中にテキストを出力させることができるようになる。 ターミナルの中央に表示させる場合は、『tput cols』コマンドで幅を取得できるのでサブシェルで取得させるといいだろう。

printf "%*s\n" $(( (幅 + $(printf 文字列 | wc -c)) / 2 )) 文字列
printf "%*s\n" $(( ($(tput cols) + $(printf 文字列 | wc -c)) / 2 )) 文字列 # ターミナルの中央に配置する場合

Twitter上でそういった処理についてebanさんがやられてたので、理解するため+忘れないために残しておく。

blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | grep -o . | awk 'a=$0=a$0' #シェル芸
あ
あい
あいう
あいうえ
あいうえお

この処理、ぱっと見だと何をしているのかよくわからないのだが、変数aに前の行の内容...


ふと、コンソール上で各行の内容を配列の形で出力させることができないかと思ったので、やってみることにした。 とりあえず、条件演算子(三項演算子)を使って初回のみカンマなし、次回以降はカンマありで出力させることで対応が行える。

awk {a=a?a","q$0q:q$0q}END{print "["a"]"}' q="'"
awk '!x[$0]++{a=a?a","q$0q:q$0q}END{print "["a"]"}' q="'" #重複を除外する場合

PythonのスクリプトでDBから日本語を含む文字列を扱った際、『UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3』といったエラーが出た。 これは、Pythonでは明示的に指定しないとデフォルトエンコーディングがasciiになっているため、UTF-8がそのまま利用できないのが理由のようだ。

blacknon@BS-PUB-UBUNTU-01:~$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "...