職場や自宅では、クライアントマシンとしてMacを使っている(+Manjaro in Thinkpad)。 で、個人的にその日の作業用に日付別のディレクトリ(自分の場合は~/Work/YYYYMM/YYYYMMDD/)を作っておいて、そこに一時ファイルやダウンロードしてきたファイル、その日のメモなどを配置するような使い方をしている。

このとき、ダウンロードディレクトリ (~/Downloads)を日付別のダウンロードディレクトリ(~/Work/YYYYMM/YYYYMMDD/Downloads)のシンボリックリンクとすることで、ディレクトリが日付別になっていることを意...


少し前(というか2019年の年末)に、Twitterでファイルをコマンドで利用したあとにリダイレクトで上書きしてはいけないよねというツイートがあった。

これは結構やってしまう(そしてやらかして学習する)人が多いと思うのだけど、shellの解釈の順序の関係でコマンドの処理より先にリダイレクトの処理が...


先日実施された第45回シェル芸勉強会に出席してきたので、その復習。 前回の45回はawkでゴリゴリ解いていくような問題が多かったのだけど、今回はいろんなコマンドを組み合わせて解いていくような問題が多めになっているらしい。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

csvファイル「data.csv」に、日別のトマト・バナナ・ピーマンの売れた個数が書かれているので、それぞれが記録されている最後の日の日付...


よく作業用のディレクトリとかを一定期間ごとにtar(+gzip)でアーカイブしてあるのだが、たまに過去のデータを調べるためにそのアーカイブしたファイルの中を検索したい事があったりする。 そういった際にいちいちアーカイブを展開して調べるのは面倒なので、なんかいい方法が無いかなと考えていたところ、どうやらGNU tarだと「--to-command」で指定したコマンドに対し、標準入力でtar内のファイルの中身を渡すことができるらしい。 なので、環境変数でtar内のどのファイルなのかも出力させることができる。

ただ標準入力から受け付けてるので、tar内のどのファイルに指定した文字列が含まれて...


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

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


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

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


たまにlogを見ながら作業をしたりすることがあるのだけど、そういうときサーバによってはログの日付がGMTで記録されてたりする。 ここは日本であり、やはり自分もJSTで普段生活しているので、いちいち脳内で+9時間して読み取るのはちょっとだるい。できればJSTになってる時刻でログを読みたいところ・・・。

というわけで、取得したログをJSTに変換して出力する方法について考えてみることにした

1. awkで日付を変換する(外部コマンド使用)

apacheのログなんかだと、デフォルトでは日付の表記が「28/Nov/2019:09:03:19」のようになってしまっている。 これだとちょっと...


Twitterをボケーッと眺めていたところ、xargsで呼び出したコマンドにキー入力をしたいという内容があったので、どうやったらできるのか調べてみた。

通常、対象のプロセスで標準入力が開いてないとだいたいの(というか、普通の)コマンドは処理を待たずに終了してしまう。なので、なんとかしてターミナルを標準入力として渡してやればいいということになる。

1. /dev/ttyを読み込ませる

以下のように、/dev/ttyをxargsで呼び出したコマンド内部で読み込ませる事で、ターミナルの入力を渡すことができる。


先日のシェル芸勉強会において、awkで巨大な数字を取り扱うという内容があった。 awkでは、巨大な数字を扱おうとすると以下のようなエラーが出力されることがあるのだけど、これを回避する方法について考えるという内容だった。

$ echo|awk '{print(999^300)}'
+inf

Stack Overflowとかを漁っていると、どうも53bit分までのデータしか扱えないため、それ以上の数字になるとinfとして扱われてしまっている模様。

c++ - Does big integer in AWK only have 53 bits? - Stack Overflow

...

先日行われたシェル芸勉強会の中で、別のファイルから1行ずつデータを取得させたいということがあった。 いろいろとやり方を調べたりしていたのだが、その中でくんすとさんがいい感じの回答をしていた。

cat speech | awk 'NF==0{getline< "speech2"}{print}'#シェル芸

実行例を書いてみる。 以下の例では、「seq.txt」の空行に「aiueo.txt」というファイルの中身を差し込んでいっている。


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


ちょっとしたツールをPythonで作ったので、pipインストールできるように以下のようにsetup.pyを書いてたのだけど、どうもinstall_requiresが処理されないということがあった。

setup.py
import os import platform import setuptools from hoge import __version__ if __name__ == "__main__": setuptools.setup( name='hoge', version=__version__, ins...

先日実施された第44回シェル芸勉強会に出席してきたので、その復習。 今回は実用的な内容…ということだったのだが、そうはならんかったらしい(´・ω・`)。 冒頭で、awkなどでゴリゴリ書いていく問題がメインらしいので、多分難しめなんだろうなぁと思ったけど、おわってみたらやはり難しい問題が多かった。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

数独の問題で、マップ?のデータから各行列にどのような値が入って...


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_...

あまり仕事とかではないのだけど、たまにコンソール上で全く同じ値を持つ以下のようなテキストから、ユニークな値(今回の場合はB)だけ色を付けたいと思うことがある。

A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A B A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A
A A A A A A A A A A

一番簡単なのは、grepでユニー...


最近になってReverse Shellをちょっとだけ使う機会があったのだけど、前に学習してたよりいろいろと便利なやり方とか方法がいろいろとあるのを知ったので、ちょっとまとめてみることにした。

1. 受付側のコマンド

実行側のシェルを受け付ける側。listen。

1-1. ncを使う場合

nc -nlvp 

1-2. socatを使う場合

socat tcp-listen:,reuseaddr,fork stdout


先日、Twitter眺めてたらそんな感じの処理について見かけたので、楽に実現する方法について考えてみる。

1. tarでディレクトリだけを固める

別々のホスト間で処理する場合、tarでディレクトリだけを固めてしまい、コピー先でそれを展開するという方法が楽そうだ。

cd SourceDir;find ./ -type d -print0 | xargs -0 tar czvf dir.tar.gz --no-recursion # dir.tar.gzにディレクトリだけ固める
cd TargetDir;tar xzvf dir.tar.gz # コピー先にtar.gzを持っていって展...

昨日、通勤中にふとGithubの通知のトコに謎のリポジトリが流れてきた。

内容を確認したところ、どうやら「LINEとかTwitterで知らない女の子に下心丸出しの絵文字入れまくったメッセージ送るおじさん」のメッセージ文のジェネレーターのようだ。 ちゃんと形態素解析とかもして処理してるようで、単純に文言かけ合わせてるようなコマンドではないようだ。 (ぐれさんまた妙なものに全力を…...


sedで置換結果にANSI Escapeを使って色付けをする

時折、sedで置換する際にエスケープシーケンスを使って文字の色を指定したい場合というのがあると思うけど、それについて今まで把握してなかったので備忘で残しておく。 sedでエスケープシーケンスを表現する場合、残念ながらechoのときのように\eとかで表現しても置換できない。じゃあどうすればいいのかというと、エスケープを文字コード(\x1b)で記述してやることで表現できる。

sed 's//\x1b[32m\x1b[0m/g;'

実際に動かしてみるとこんな感じ。 ちゃんと色が付与されているのがわかる。


先日行われたシェル芸勉強会に行ってたのだが、そこで漢数字やローマ数字をラテン数字に変換できる numconv なるコマンドの存在を知った。

どうやらパッケージは用意されているようだが、管理システムでインストールできるのはaptだけのようだ。 brewやyum、pacmanでは入れられないので、用意されているパッケージファイルを利用するか、ソースからコンパイルする必要がある。

apt install numconv

忙しかったので遅れてしまったけど、先日開催された第38回シェル芸勉強会に参加してきたので、その復習。 前回はちょっと別の用事があったので参加しておらず、ちょっと久しぶりな感じ。

今回は某北◯鮮企画ということで、北朝◯に絡めた問題だけにしたらしい。 (えぇ…?(´・ω・`))

問題及び模範解答はこちら。最初に、問題等に使用するファイルをgitからcloneしておくといい。

Q1

ウェブからデータをスクレイピングしてきて、金ファミリーの誕生日一覧をゲットしようという問題。 うーわ、やりたくないw。と思ったけど、とりあえず取得しよう。(Googleの検索履歴に残るの嫌だからシーク...


Twitterを見ていたら、そういう処理について見かけたので備忘で残しておく。 あるディレクトリ配下のファイルに対して、特定の列(3列目など)をpasteで横並びにして比較するというもの。

ファイル数が決まってて、かつ少ないのであれば、pasteに対してプロセス置換を使ってコマンドの実行結果を渡すことで対応ができるけど、ファイル数が多いとちょっとツライ。


curlにかわるコマンドラインのhttpクライアントコマンド『HTTPie』

ちょっと調べ物をしていたところ、Pythonで書かれたモダンなcurlというようなCUIツール『HTTPie』なるものを知った。

curlだと色分け表示されずにちょっと見にくいところを色付き...


Linuxなどで定期的に特定のプログラムを実行したい場合、外部のジョブシステム(JP1だったりRundeckだったり)やcronで処理をすることが多いだろう。 だが、特定の日時に1度だけ実行したい、という場合は、atコマンドという日時を指定して、一度だけプログラムを実行させるコマンドを利用する場合が多い。今回は、そのatコマンドを使う上で覚えておきたい使い方をまとめてみる。

なお、ここではatと同じパッケージに含まれるatq、atrm、batchコマンドについても触れる。

1. 基本的な使い方

最初にも記述したことではあるが、atコマンドは指定した時間にジョブを実行するためのコマン...


Twitter見てた時、そういう処理の仕方についてわからないというのを見かけたので、一応何かの時のために残しておくことにする。 通常、LinuxやMacに入ってるmvやcpでは、コピー先のディレクトリが無かったら作成するような機能はないので、ひと手間必要になる。

1. findからxargsを使ってコピー、移動させる場合

findからxargsに対象のファイルPATHを渡して、それをcp、mvを使ってコピーや移動をさせる場合。 この場合、コピー時にディレクトリが無いとエラーになってしまうので、一度mkdirで(フォルダがない場合に)生成させる必要がある。 以下、サンプルコード(mvの場...


前に、yum/rpmコマンドでファイルがどのパッケージに含まれるか、逆にパッケージを指定してどのようなファイルが展開されるかについて書いたので、今回はapt/dpkgコマンドで同様のことをする方法について残しておく。

1. 指定したファイル名がどのパッケージに含まれるかを調べる

指定したファイル名がどのパッケージに含まれるか(yumでいうprovides)を調べる場合、aptで行う場合はそのものズバリな機能はないため、apt-fileという別のプログラムを利用する必要があるようだ。 以下のコマンドでインストールできる。


いい感じに色分けして表示してくれるCUIのバイナリビューア『hexyl』

ネットをぼけーっと見てたところ、バイナリの値をいい感じに色分け表示してくれるCUIのバイナリビューア『hexyl』なるコマンドを見かけた。 Rustで書かれているらしい。

面白そうなので早速インストールしてみる。


シェル芸botに入ってるunko.towerの中、外にテキストを差し込んで遊ぶ

よく、Twitterにあるシェル芸bot(フォローされてたら「#シェル芸」 というハッシュタグ付きのツイートをつぶやくとそのシェル芸を実行して結果を引用リツイートで出してくれるボット)というボットで遊んでるのだけど、そこでよく遊んでたシェル芸を残してなかったので、備忘。

シェル芸botには、super_unkoなるうんこ関係のコマンドを詰め合わせてるうんこづくしなリポジトリがあって、その中にアスキーアートのうんこを生成するunko.towerというコマンドが存在している。

unko.tower N

今回は、このunko.towerのうんこの中や背景に任意のテキストを差し込んでいく。


ターミナル上でファイルをSyntax Highlightして表示してくれる『bat』

数年前に、LinuxでソースファイルをSyntaxHighlightして出力させるコマンドについて書いたことがあるのだが、最近batというRustで書かれたものも出たらしい。

Boxを出力して、その中にソースコードをSyntax Highlightして表示してくれるらしい。 インストールは簡単で、Ubuntuなら用意してあるdebパッケージを使えばいいし、OS Xならbrewからイン...