二つのファイルの共通行(または共通しない行)を得る

例えば、サービスAでは登録されているけれどもサービスBには登録されていないユーザの一覧を得たい、という様な場合。もちろんdiffでよしなにやることもできますが、commも便利です。 例えば次の様にリストがあるとします。 サービスAのユーザーリスト(users_a.txt): alice bob charlie dave oscar サービスBのユーザーリスト(users_b.txt): charlie isaac justin mallory oscar これらに対してcommを使うと次の出力が得られます: $ comm users_a.txt users_b.txt alice bob charlie dave isaac justin mallory oscar TABで揃えられた列がそれぞれ左から、Aにだけ存在する行、Bにだけ存在する行、Cにだけ存在する行、となっています。これだけだと別にそれほど便利ではないんですが、commはそれぞれの行を非表示にする事もできます。それぞれ、非表示にしたい行を-1 -2 -3で指定します。 Aだけに存在する行を表示する: $ comm -23 users_a.txt users_b.txt alice bob dave 両方に存在する行を表示する: $ comm -12 users_a.txt users_b.txt charlie oscar diffだとdiffの後にgrepやらなんやらして必要な物を抜き出す必要があるでしょうから、これは楽ですね。 もちろん、diffの様に他のコマンドの標準出力を取ることもできます。 例えばhttps://example.com/api/users_b.txtが先ほどのusers_b.txtと同じ内容を返すとするとしてAだけに登録しているユーザーを取得したい場合 $ curl -s https://example.com/api | comm -23 users_a.txt - alice bob dave とできますし、2つのユーザーリストを返すAPIが有ったとして、共通のユーザーを一覧にしたい場合、次の様にできます: $ curl https://example1.com/users | jq . [ { "username": "alice" }, { "username": "bob" }, { "username": "charlie" }, { "username": "dave" }, { "username": "oscar" } ] $ curl https://example2....

2022-09-28 · nasa9084

bashのhere-documentは一時ファイルを作成するらしい

皆さん使ってますか、here-document。bashでいうとこういう奴: cat <<EOF this is here document EOF 出力はこう: this is here document 複数行に渡るテキストをリテラルとして表現したい場合に便利ですね。で、shellscriptからREST APIにリクエストを投げたくて、here-documentを使ってJSONをべたっとスクリプト内で書いてたんですけど、こんなエラーが出てました(パスはもちろん違いますよ。念のため。): /path/to/shellscript/using/here-document.sh: line 179: cannot create temp file for here-document: No space left on device 全然知らなかったけど、here-documentって一時ファイルを作成するんですね。確かめてみます。 $ docker run -it --rm centos:7 bash [root@8017e5e28d6e /]# yum install -y strace (中略) [root@8017e5e28d6e /]# cat <<EOF > script.sh > cat <<EOS > foo > bar > baz > EOS > EOF [root@8017e5e28d6e /]# strace -f bash script.sh |& grep tmp [pid 61] stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ....

2021-09-08 · nasa9084

rustで書かれたlsの代替コマンドexaをインストールしてみた

twitterでおのかちお氏(鍵垢なのでここでは紹介できないが)が<code>exa</code> というlsの代替コマンドを試してみている、ということでスクショをアップしており、これがなかなか良さそうであったので、探してインストールしてみました。 website の説明によると、 A modern replacement for ls. トのことで、色をつけれたり、早かったり、tree viewができたり、Gitのステータスを表示できたりするらしい。 macの場合、homebrew でインストールできるようなので早速インストールしてみます。 $ brew install exa very easyですね。使ってみましょう。 なるほど、デフォルトの表示はlsと同じくgrid viewなんですね。ホームにディレクトリしかないのでわかりにくいですけど、字が太いですね。あとklaussinani/hyper-pokemon を使っている都合で、色は表示されません・・・ アイコン付きで表示してみましょう。アイコンを表示したい場合は--iconsオプションをつければ良い、とのこと。 おや、表示されないですね。これは困った。まぁこの手の問題は(見た目から言っても)フォントがインストールされてないために発生しているのだろう、とあたりをつけつつ、issueを検索します。 するとどうやら nerd fonts というフォントがアイコン表示用に使用されているようです。これをインストールしてみます。 $ brew tap homebrew/cask-fonts ==> Tapping homebrew/cask-fonts Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-fonts'... remote: Enumerating objects: 19, done. remote: Counting objects: 100% (19/19), done. remote: Compressing objects: 100% (14/14), done. remote: Total 35658 (delta 8), reused 9 (delta 5), pack-reused 35639 Receiving objects: 100% (35658/35658), 6....

2020-05-20 · nasa9084

cut vs. parameter expansion

TL;DR:: bash/zsh parameter expansion is faster than cut. which is faster? Consider you want to take out hostname from URL or IP with port like some.mysql.server:3306 or 192.168.1.10:3306 using bash/zsh. There are some way to do this. The first way is using cut command: $ TARGET="192.168.1.10:3306" $ echo ${TARGET} | cut -d ":" -f 1 Now printed 192.168.1.10 on your screen. The second way is using “shell parameter expansion”, which is functions of bash/zsh built-in....

2018-02-26 · nasa9084