シェル芸十八般
武芸十八般のひとつシェル芸ってワードがふと湧いてきたけどどちらかというとシェル芸十八般とかの方がよさそう。grep, cut, xargs,...
— κeen (@blackenedgold) 2016年7月13日
cat
ファイルの内容を吐くのに使う。 -n とか使えそうなオプションがあるが滅多に使わない
例
cat file
head
標準入力の先頭のほうだけを切り取る。大きなファイルに対して処理する前にちょろっと試すのに使う
例
cat large_file | head -n 10 | ...
tail
標準入力の末尾のほうだけを切り取る。-f
オプションでよく使う
例
tail -f log_file | grep -ie error -e '$'
grep
globally regexp print. 汎用フィルタとして様々に活躍する他飛び道具的な使い方もある。
例
cat file | grep some_word
cat file | grep -v "^[ \n\t]+$"
echo hello | grep -o .
awk
プログラミング言語awk。だいたい cut
の上位互換として使われる。
例
ls -l | awk '{print $3}'
seq 1 100 | awk 'BEGIN{sum=0}{sum+=$0}END{print sum}'
sed
プログラミング言語sed。だいたい s/RE/replace/
が使われるが使いこなすと深い。
例
cat log_file | sed 's/error/ERROR/gi'
cat some.csv | sed 1d
xargs
標準入力を横に並べる、コマンドを並列に実行する、繰り返し実行をするなどストリーム内での制御機構的働きをする
例
seq 1 10 | xargs echo
find . -type f | xargs -P $(nproc) grep FIXME
inc(){ echo $(( 1 + $1 ));}
export -f sum
seq 1 10 | xargs -I@ bash -c 'sum @'
find
複雑なクエリ式を書けるコマンド。(シェルに依存してしまう)ワイルドカード展開の肩代わりなんかも出来る。xargsに繋げることが多い。
例
find . -type f -name '*.md' -exec basename '{}' .md \;
sort
ほぼ次のuniqに繋げるために使うことが多い。あるいはuniqした結果を使う。
例
cat .histfile | grep '|' | sed 's/|/\n/g' | awk '{print $1}' | LANG=C sort | uniq -c | LANG=C sort
uniq
多くは頻度のカウントに使う。
tar
リモートホストとファイルをやりとりするのに使う。
例
ssh stepper ssh host1 tar czf - -C '/var/log/somedir/' stdout.log stderr.log | tar xzf - -C /tmp
zcat
圧縮ファイル扱うのに使う。よくtarと組み合わせる。 プロセスが分かれる分マルチコアを使えるのでtarのzオプション使うより速いかもしれない。
例
zcat some.tar.gz | tar tf - | xargs -I@ -n 1 basename @ .java
date
日付操作用コマンド。BSD系とGNU系で全然違う。つらい。
例
find logs -type f -name '*.log' | xargs -I@ dirname @ | sed 's|logs/||' | tr / - | xargs -I@ date --date=@ +%w | sort | uniq -c
tr
文字置換、削除。sed
で出来るじゃんとか言わない。
例
cat data.list | tr -c '[a-zA-Z0-9\n]' _ | xargs touch
curl
なんでもプロトコル喋る人。結果を標準出力に吐くのでREST APIを叩いた後シェル芸に繋げやすい。
例
curl http://example.io/status | jq -r '.status'
jq
チューリング完全言語jq。REST API叩いてjsonが返ってきた時に使うと便利。
od
バイナリデータを扱うのに使う。
例
cat /dev/urandom | od -x | head -n 10 | ...
tee
T字管のようにパイプを分岐させるのに使う。あるいはシェルの機能であるリダイレクトをコマンドとして実行するのに使う。
例
cat nginx.conf | ssh stepper ssh host1 sudo tee /etc/nginx/nginx.conf > /dev/null