シェル芸十八般

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
Written by κeen