xargsで各引数ごとの出力の先頭を色分けして表示する

結構前にネットサーフィンしてたところ、xargsの行頭に引数を色付きで出力するようなコマンドについて見かけたのだが、同じような処理を既存のxargsで行えないかと思ったのでやってみた。

seq 3 8 | nl | xargs -n2 bash -c 'seq $1 | sed "s/^/printf \$(tput setaf 0)\$(tput setab $(($0 % 9)))$1\$(tput sgr0)\"...

前にgrepでひらがな・カタカナ・漢字を抽出する方法について書いてたことがあったけど、先日置換が必要になったので念の為残しておく。

PerlのUnicodeプロパティスクリプトを使った置換(perl)

置換と言ったらsedなのだけど、残念ながらPerlのUnicodeプロパティスクリプト(\p{Hiragana}みたいな指定)がsedでは使えない。 なので、Perlで置換処理を実行する必要がある。

# perlでひらがなだけを置換する場合
command... | perl -C -ple 'use utf8;s/\p{Hiragana}/_/g'
$ cat a....

2021年あけましておめでとうございます(´・ω・`)。 色々とゴタゴタしてるうちに2020年が終わってしまった…。 最近は時間が経つのが早い…。

そんな年末年始にdotfilesを色々といじってる際、再読込するとPATHが重複して登録される記述がところどころに散見される状態だった。 これを修正するのも面倒だし、どうしたもんかなと考えていたのだけど、bashrc/zshrcで読み込みんだ最後にPATHから重複した要素をすべて削除させることで対応することにした。

以下のような記述をbashrc/zshrcの末尾に記述すればいい。

export PATH=$(printf %s "$P...

たまに、雑にパラレルにpingを打ちたいということがあったので、そういうbash funcionを作った(だいぶ前に)。 pingの行頭にtimestampを付けて、かつ雑にブレース展開などで複数のipアドレスにpingを打ったりできるようにしている。

pingの他、port指定のためにcurlコマンドが必要になるけど、まあfunctionとかを自由に入れられる環境なら入ってるでしょってことでチェック入れてない。

自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$...

今年に入ってから自宅の環境を全部作り変えしたのだけど、その一環としてGithubのリポジトリをローカルのGitlab-CEにMirroringしてバックアップをする仕組みを取り入れてみた。

実はGitlabではGithub等とのMirroringの仕組み自体は用意されているのだが、残念ながらGitlab-CEではpushしか扱えない様になっている。 (Gitlab-EEではpush/pullどっちもできるのだが、Github-CEではpullができない(少なくとも、手元のGitlab-CE13.2.2ではダメ。))

流石に個人用に使ってるGitlabでEEを使うのはお財布的にちょっ...


ふとした思いつきで、bashやzshのhistoryファイル(通常は環境変数のHISTFILEで指定したファイル)以外のファイルに、任意のフォーマットで実行したコマンドや実行時間、カレントディレクトリといった情報を記録できないだろうかと思ったので、試してみることにした。 今回はファイルに出力しているが、中の処理を書き換えれば実行履歴をDBに記録することもできると思うので、もし利用する場合は使い方に応じて適宜書き換えて貰えればいいだろう。

なお、この方法は単純にシェルの設定で対処しているだけの方法なので、ログの記録を強制できるというものではない(回避することは可能なはず)。 もし実行コマンド...


ごくごくたまにではあるのだが、GoogleやらBingの検索結果を一覧で取得することがあったのでそういうスクリプトをこさえて対応していた。 で、その実行結果で特定のドメインの検索結果からPATHごとにどのようなGETパラメータが使われているか集計したいということがあった。

具体的に言うと、例えば自分がよくお世話になっている上田先生のブログ(https://b.ueda.tech/)で検索かけて、その結果となるURLの一覧を抽出したとする(上田先生勝手にスミマセン…)。 その場合、以下のようなURLの一覧が取得されるのだが、そのPATHごとにどのようなGETパラメータをのパラメー...


pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。 で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。


Dockerにbashでログインする際、手元の環境のbashrcやvimrcを使って直接ログインしたいということがある。 原理的にはsshの場合と同じやり方でできるだろうということでやってみた。

とりあえず、以下のようなコマンドでローカルのbashrcを使ったログインが可能だ。 (読み込ませているbashrcのPATHは自分の環境のものなので、適宜書き換えが必要。)

docker run --rm -it コンテナ bash -c '/bin/bash --rcfile <(echo -e '$(cat ~/dotfiles/{.bashrc,sh/{sh_function,sh_...

bash/zshで、入力中の内容を利用したカスタムキーバインドを作りたいということがあったので、備忘で残しておく。 (当たり前の話として、bash/zshどちらもキーバインドでfunctionを呼び出すことになるので、適当なfunctionを作ることになる)

以下、実際に動かしてるときの状態。 最初はzsh、次にbashに切り替えている。

ここでは、サンプルとしてカーソル位置から右側の文字列をダブルクオーテーションでくくるfunctionを作成する。


先日、ローカルのrcファイルをssh経由でそのまま利用する方法を知ってから色々とシェル関数を作成してる。

で、ふと「 peco とか fzffzy のようなインクリメンタルサーチしてくれるコマンド、 ANSI Escape Code を使えばシェルスクリプトで作れるのでは?」ということを思いついたので、ちょっとやってみた。

最初は普通にシェルスクリプトでやろうと思ったのだが、それだとssh経由でリモートに持っていくときにファイルとして渡してあげないといけないので、それは面倒だとシェル関数にしている。 あと、最初絞り込みをシェルの...


bashrcで直前のexit statusが正常終了・異常終了に応じてプロンプトの表示を切り替えさせる

個人的にはローカルではzshを使っているのだけど、ローカルのbashrcファイルをリモートでファイルを配置せずに利用する方法を知ってリモートサーバ用のbashrcを設定するようになった。 で、zshでやっているようにプロンプトに顔文字と直前のコマンドの成功・失敗に応じて切り替えを行わせるようにしたので、(わざわざ残しとくほどのものでもなさそうだけど)一応その内容を備忘として残しておく。

直前のコマンドの終了ステータスを取得する場合、PROMPT_COMMAND を使って取得させる必要がある。 なので、以下のような設定を.bashrcに書いてやるといいだろう。

# カラーコードを...

ターミナルでCUIを操作してたりすると、たまーにスピナー(棒がくるくる回ってるやつ)が表示されるコマンドがあったりする。その他にも、zshのtab補完のようなプロンプトの下でアニメーションする処理もある。 こういった、ターミナル上で文字を使って動く処理は、果たしてどうやって作ってるのだろう?と思ったので、簡単に作り方をまとめてみることにした。

1. 「\r(復帰コード)」を使う

1行のアニメーションであれば、一番手軽な方法。 bashやzshでは、\rキャリッジリターン(復帰コード) という制御コードを指定できる。この制御コードがあった場合、カーソルを行頭に戻すという処理が...


先日、ちょろっと調べ物をしていたところこんなページを見かけた。 某掲示板から生まれたキャラクタの「やる夫」が煽ってくるcommand_not_found_handleを作ってみるよ、という内容のもの。

あー、これはうざいなぁ、と思いつつ、できればターミナルの画面をまるごと使用するのではなく、プロンプトのすぐ下で煽ってくるようにしたほうが面白そうだなーと思ったので、ちょっとやってみることにした。 オリジナルのはAAをechoで表示後にclearしてやることで処理しているのだけど、そうではなくプロンプトを表示させつつAA等を動かす場合、ANSI Escapeで処理してやる必要がある。

で...


bashで、現在読み込まれているfunctionの一覧とその内容(コード)を、ターミナルからbashrc等を読まないで確認したい時がある。 調べたところ、以下のような方法で確認できるようだ。

1. setで調べる

単純に、全部のfunctionとその内容を見るだけであれば、setコマンドをオプションなしで実行してやればいい。 function以外も出力されてしまうが、読み込まれているfunctionとそのコードが出力される。

blacknon@test-ubuntu18:~$ set
BASH=/bin/bash
...
quote ()
{
    local quoted=${...

先日、 ssh接続先でローカルのbashrcを使うシェル芸 というのを書いたのだが、同じような方法を使えばvimrcやtmuxの設定ファイルも持っていけることに気づいた。 bashの--rcfileオプションのように、vimでも-uオプションで使用するvimrcファイルを指定できるので、bashと同じようにプロセス置換を利用してやればいい。

ただ、vimrcやtmux.confの場合、bashrcのように1回だけ読み込ませればそれでおしまいにはならない。 コマンドを実行するたびに設定ファイルを読み込むことになるので、起動してつなげっぱなしのbashとはすこしやり方が異なる。 vim...


ふと、ローカルにあるbashのrcファイルを、ssh接続先で一時ファイルを作成せずに利用できないかなーと思ったので調べてみた。 で、調べた結果bashには実行時に指定したPATHのrcファイルを読み込むオプション(--rcfile)があるのがわかった。 であれば、ssh接続時にそのコマンドを実行し、さらにローカルファイルの内容をプロセス置換でファイルとして読み込むようにssh越しに渡してやればいけるということになる。

ssh -t user@host 'bash --rcfile <(echo "'"$(cat ./path/to/local.rc)"'")' # そのまま渡す場合
s...

よくbashでコマンドの一覧を取得する際に利用するcompgenだが、残念ながらzshではデフォルトで有効になっていない。 で、その状態でzshでPATH配下にあるコマンドの一覧を取得したいといった場合、どうすればいいだろう。

zshでは、以下のコマンドでPATH配下にあるコマンドの一覧が取得できる。

whence -pm "*" # フルパス表示
print -rl -- $commands # フルパス表示
print -rl -- ${(ko)commands} # コマンドのみ表示

先日、Twitterでこんなツイートを見かけた。


bashの算術式についての記事を見てて、ビットシフトを算術式でできるよというのを見かけたので、それを利用してビット数一覧を出力させてみる。

eval echo "\$((1<<"{0..16}"))" | fmt -1
eval echo "\$((1<<"{0..32}"))" | fmt -1 | numfmt --to=iec # MBとかに変換する
blacknon@BS-PUB-UBUNTU-01:~$ eval echo "\$((1<<"{0..16}"))" | fmt -1
1
2
4
8
16
32
64
128
256
512
1024
2048
4096...

bash/zshで実行したコマンドをクラウド上にあげてhistoryを共有する『Bashhub』

bashで実行したコマンドの履歴は\~/.bash_historyというファイルに記録され、上下キーやCtrl + Rで検索して実行することができる。 で、(当たり前の話だが)ローカルにしか記録されず、他のノードでは利用することができない。

今回紹介するBashhubは、クライアントを入れて実行したコマンドをBashhub上にも送信し、同じクライアントを入れているノードでも検索・実行できるようにするというOSSのサービス(当たり前だけど、MySQLとかのログイン時にパスワードとかオプションで指定するとその辺も一緒に送信されてしまうので注意)。 zshでも利用可能なようだ。

1.

...

補完されているコマンドの一覧を取得したいという場合、単純に考えると以下のように$PATHを分解して各ディレクトリごとのファイル一覧を取得するような処理が考えつく。

echo -e ${PATH//:/\\n}|xargs -I@ ls -1 @ 2>/dev/null | sort
echo -e ${PATH//:/\\n}|xargs -I@ ls -1 @ 2>/dev/null | sort | grep ^STR

ただ、実はこんなことをしなくてもbashで用意されている補完用のコマンド「compgen」を使うことで、もっとスマートにコマンド一覧を取得できる。

comp...

調べ物をしてたところ、ヒストリーからTUIで対象のコマンドを選択できる「HSTR」というツールを見かけたので、実際に使ってみることにする。 gifがgithubのREADMEに上がっているので、そちらを見れば大体のイメージは湧くと思う。

1. インストール

インストールは以下のコマンドで行える。

CentOSの場合

sudo yum install hstr

Ubuntuの場合

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

ソースから

...

sedでは四則演算とかの計算処理については対応していないのだが、bashと組み合わせる事で計算処理ができないかとやってみたので備忘で残しておく。 で、結論としては以下のように、e(置換や抽出した内容を元に組み立てたコマンドを実行する) を利用することで、bashで $((計算式)) をechoさせることで計算をさせることができる。

echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge'
blacknon@BS-PUB-UBUNTU-01:~$ echo 1234 | sed 's/[0-9]*/echo $((& + 1111))/ge...

ふと、コンソール上で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]++...

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

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

パイプから受け付けた内容を変数に入れる場合、以下の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 ~]#...

ターミナル上で集計処理などをしてて、数字の桁数が多いと読めなくなってくる事がある。 numfmtコマンドが使えるかと思ったのだが、システムで使用する数字を変換(1024MB→1GBとか)する場合は良いとして、ただの数字の桁区切りはできないようだ。 という訳で、他で数字を桁区切りさせる手法について調べてみた。

1. printfで桁区切りをさせる

bashの組み込みコマンドであるprintfを使う場合、以下のように「%'d」でフォーマットを指定してやるとよい。

printf "%'d\n" num
echo num | printf "%'d\n" $(cat) # パイプか...