〜2015年12月上旬〜
コンテナを消すときに
% docker ps -l % docker rm `docker ps -lq`
ってのはヒストリーを呼び出してよくやるが、
打つ文字が長くなっても
% docker ps -l % docker ps -lq|xargs docker rm
のほうがカーソルをあちこち動かさなくて済む分なんとなく速い。
巷にはdocker images --treeとか--vizとか便利そうなオプションの使用例があるが、
できるだけ小さく保つという方針によりすでにdeprecate。
--treeに関しては
Deprecate 'docker images --tree' and 'docker images --viz' by shykes · Pull Request #5001 · docker/docker
を参照。
昨日の--treeの件はdockvizを使うと解決する。
dockerを起動するのもいいが、dockviz自体はstaticにlinkされてるので抜き出しちゃってもいい。
% docker run nate/dockviz images Unable to find image 'nate/dockviz:latest' locally latest: Pulling from nate/dockviz 8bd831364921: Pull complete 3dfb5e1486b5: Pull complete 607d274e6daa: Pull complete Digest: sha256:9afe152b794ae8480b230545ec75bc81f5e11a0b9d28158bb609479de5a95a72 Status: Downloaded newer image for nate/dockviz:latest Unable to access Docker socket, please run like this: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images <args> For more help, run 'dockviz help' % docker ps -lq | xargs docker export | tar x dockviz % file dockviz dockviz: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped % ./dockviz images -t ├─8bd831364921 Virtual Size: 5.9 MB │ └─3dfb5e1486b5 Virtual Size: 5.9 MB │ └─607d274e6daa Virtual Size: 5.9 MB Tags: nate/dockviz:latest ├─039b63dd2cba Virtual Size: 1.1 MB │ └─c51f86c28340 Virtual Size: 1.1 MB Tags: busybox:latest └─0c5a95b92fbb Virtual Size: 87.0 MB └─c59aaaa35c20 Virtual Size: 87.0 MB └─40f9f9531e43 Virtual Size: 820.7 MB └─560151ab7b6b Virtual Size: 882.4 MB └─dec1400ab1bd Virtual Size: 882.4 MB └─a0d99d01b2a3 Virtual Size: 905.5 MB └─232ed8986774 Virtual Size: 1.0 GB └─3859c9a9c729 Virtual Size: 1.8 GB └─86cceda0c83a Virtual Size: 1.8 GB └─ca77a6cff892 Virtual Size: 1.8 GB └─be540060a179 Virtual Size: 1.8 GB └─fc9a7b5c096a Virtual Size: 1.8 GB └─7db11899a300 Virtual Size: 1.8 GB Tags: hone/mruby-cli:latest
コンテナを立てるためだけに、わざとエラーを起こしてる。
素数といえばfactorだが、このfactorへの入力はかなり柔軟に指定できる。
% factor 10 20 10: 2 5 20: 2 2 5 % echo 10 20 | factor 10: 2 5 20: 2 2 5 % echo "10\n20" 10 20 % echo "10\n20" | factor 10: 2 5 20: 2 2 5
引数でもいいし、標準入力でもいいし、複数でもいいし、まったくもって使いやすい。
Bash - そのシェルスクリプトもうちょっとシンプルに書けそう Tips集(Golf/シェル芸ではない) - Qiita
の
cat data.csv | while read line do cols=(`echo $line | tr ',' ' '`) for ((i=0; i < ${#cols[@]}; i++)) { echo "Column $((i+1)): ${cols[$i]}" } done
はもっと簡潔に書ける。BASHならread -aで配列に直接入れられる。
cat data.csv | while read line do cols=(`echo $line | tr ',' ' '`)
は
cat data.csv | while IFS=, read -a cols do
でいい。
% bash -c 'echo "a,b c,d" | while IFS=, read -a f;do for i in "${f[@]}";do echo "$i";done;done' a b c d
ぐぐるとLinuxでCSVを扱うにはcsvtoolというのがあるらしい。
debianにはcsvtoolのパッケージがあるのでちょっと試してみた。
% seq 9 | xargs -n3 | tr ' ' , # テスト用のCSVを用意 1,2,3 4,5,6 7,8,9 % seq 9 | xargs -n3 | tr ' ' , | csvtool col 2 - # 2番目のフィールドだけ 2 5 8 % seq 9 | xargs -n3 | tr ' ' , | csvtool col 2- - # 先頭のフィールドを削除 2,3 5,6 8,9 % seq 9 | xargs -n3 | tr ' ' , | csvtool setcolumns 2 - # 2番目まで 1,2 4,5 7,8 % seq 9 | xargs -n3 | tr ' ' , | csvtool width - # フィールド数 3 % seq 9 | xargs -n3 | tr ' ' , | csvtool height - # レコード数 3 % seq 9 | xargs -n3 | tr ' ' , | csvtool head 2 - # 先頭の2レコード 1,2,3 4,5,6 % seq 9 | xargs -n3 | tr ' ' , | csvtool drop 2 - # 先頭の2レコードを削除 7,8,9 % echo 'a,"b\nc",d' | bash -c 'x(){ for i in "$@";{ echo $i;};}; export -f x; csvtool call x -' a b c d
"b\nc"のような""と改行を含むフィールドもok。
callを使うとcallback的にコマンドが呼ばれる。
FPATがあるので-F,ではできなかった""対応が可能となる。改行を含むことまではできないが。
% echo 'a,"b,c",d' | gawk '{OFS="|"; $1=$1; print}' FPAT='[^,]+|\"[^\"]+\"' a|"b,c"|d
RubyでいうところのString#scanのようなものと考えればいい。
gawkのinfoでは FPATの例としては
FPAT = "([^,]+)|(\"[^\"]+\")"
のように()をつけてるが、実は意味がない。
改行を含むフィールドがあると
"a\r\nb"
ではなく
"a\nb"
のようになぜかCRがつかない形式になる。
行末はCR+LFなのでawk的にはRS="\r\n"にすれば普通に扱えてしまうのであった。
CygwinのGNU awkはバイナリマウントしてれば全部バイナリモードになるかといえば実はそうではない。
勝手に入力時にCR+LFをLFに変換してしまう。
昨日の例はCygwinでは通用しない。
バイナリモードにするにはBEGINでBINMODE="r"とするか、
コマンドラインで-r BINMODE=rのようにする。
% printf '\r\n' | gawk '{print length()}' 0 % printf '\r\n' | gawk -v BINMODE=r '{print length()}' 1
busyboxといえばsymlinkだが、あれってコマンドがいっぱいあって実際に作るのは面倒。
busyboxと打てばコマンド一覧が出るのでこれを拾えばいいが実は--installというオプションがある。
これを使えばhardlinkが作れる。-sでsymlinkになる。
% mkdir bin % busybox --install -s bin % ls bin [ cp egrep httpd lsmod passwd seq taskset unlzop [[ cpio env hwclock lzcat patch setkeycodes tee unxz acpid crond expand id lzma pidof setsid telnet unzip adjtimex crontab expr ifconfig lzop ping sh telnetd uptime ar cttyhack false ifdown lzopcat ping6 sha1sum test usleep arp cut fdisk ifup md5sum pivot_root sha256sum tftp uudecode arping date fgrep init mdev poweroff sha512sum time uuencode ash dc find insmod microcom printf sleep timeout vconfig awk dd fold ionice mkdir ps sort top vi basename deallocvt free ip mkfifo pwd start-stop-daemon touch watch blockdev depmod freeramdisk ipcalc mknod rdate stat tr watchdog brctl devmem fstrim kill mkswap readlink static-sh traceroute wc bunzip2 df ftpget killall mktemp realpath strings traceroute6 wget bzcat diff ftpput klogd modinfo reboot stty true which bzip2 dirname getopt last modprobe renice su tty who cal dmesg getty less more reset sulogin tunctl whoami cat dnsdomainname grep ln mount rev swapoff udhcpc xargs chgrp dos2unix groups loadfont mt rm swapon udhcpd xz chmod dpkg gunzip loadkmap mv rmdir switch_root umount xzcat chown dpkg-deb gzip logger nameif rmmod sync uname yes chpasswd du halt login nc route sysctl uncompress zcat chroot dumpkmap head logname netstat rpm syslogd unexpand chvt dumpleases hexdump logread nslookup rpm2cpio tac uniq clear echo hostid losetup od run-parts tail unix2dos cmp ed hostname ls openvt sed tar unlzma % ls -l bin/cp lrwxrwxrwx 1 eban eban 12 2015-12-10 02:47:26 bin/cp -> /bin/busybox
Dockerfileで役に立つ。
定義が提案されていたのでシェル芸を。
% curl -Ls twitter.com/nhk_news | grep -o '[0-9]\+人'| awk '$0=($2*++$2/++$1)^.5' RS=
で、実際にデータ見てみたらこれじゃだめだと判明。commifyされていた。
% curl -Ls twitter.com/nhk_news | grep -o '[0-9,]\+人' 14人 1,588,067人
というわけでこうだな。
curl -Ls twitter.com/nhk_news | grep -o '[0-9,]\+人' | tr -d , | awk '$0=($2*++$2/++$1)^.5' RS=