ShellScript
Bash
shell
チートシート

お仕事で知っておけば便利。コマンドを叩くだけで使えるワンライナーチートシート

More than 3 years have passed since last update.

仕事中にこれ知ってたら便利だなーと思うものを集めてみました。
自分にとってのメモ帳代わりにしようと思うので、今後もどんどん増やしていく予定。

任意のディレクトリ以下のファイルを検索する

# カレントディレクトリ以下の全ファイルからxxxという文字列を検索
find ./ -name '*'|xargs grep 'xxx'

任意のディレクトリ以下の画像ファイルを見つけて指定したディレクトリに全てコピー

# pictureフォルダ以下のjpgファイルを見つけてデスクトップ以下にコピー
find ./picture -name '*.jpg' | xargs -J% cp -f % ./cpy

ディレクトリ構造をコピー

tree |pbcopy
# 以下のような出力をコピー出来る
# /Users/xxx/yyy/
# ├── memo.txt
# ├── dododo.txt
# └── script.rb

空のファイル作成

# xxx.txtというファイルを作成
touch xxx.txt

日付をファイル名に入れたい場合は以下

# 141227_18-48-41.txtを作成
touch `date +%Y%m%d_%H-%M-%S`.txt

ファイルを空にする

# sample.txtというファイルを空にする
cat /dev/null > sample.txt

or

cp /dev/null sample.txt

or

echo -n > sample.txt

ファイルに新規上書き保存

before

sample.txt
hello
world

コマンド実行

cat << EOF > sample.txt
goodbye
task
EOF

after

sample.txt
goodbye
task

補足:以下でも同じようなことが出来ます。

> sample.txt
goodbye
task

複数ファイル、フォルダを一括作成等

# sample.txt, sample1.txt, sample2.txt sample3.txtをまとめて作成
touch sample{,1,2,3}.txt

# /taiyop/以下にdir_a,dir_b,dir_cのフォルダを作成
mkdir /taiyop/dir_{a,b,c}

ちなみにこの{a,b,c}とする方法をbrace expansionといいます。
Brace Expansionで生産性5割増しな楽しいコマンドライン生活

任意のプロセスが動いているか確認

# mysqlのプロセスが動いているか確認
ps aux|grep mysql

ランダム文字列を生成

head /dev/urandom | shasum |cut -f 1 -d ' '

シェルのワンライナーの再利用性を高めるたった一つの方法

ちなみに、乱数時のみ取得したい場合は下記がおすすめ。

# 0~99999まで
echo $RANDOM
# 出力結果例:273

今日の日付を取得

# 2014 12 27
date '+%Y %m %d'
# 2014-12-27
date '+%Y-%m-%d'

定期的にコマンド実行

# 1秒ごとに`say hello`を実行
while true; do `sleep 1; say hello`; done

ファイルの中をソートして重複行を削除

# sample.txtの重複行を削除
sort sample.txt -uo sample.txt

ソートせずに実行したい場合はawkコマンドがおすすめ。

# sample.txtの重複行削除
awk '!val[$0]++' sample.txt

ソートしないで重複行を削除する

任意のディレクトリのファイル数をカウント

ls -F |grep -v / |wc -l

任意のディレクトリ以下のファイル数をカウントするときは以下

# カレントディレクトリ以下のファイル数
find . -type f| wc -l

treeコマンド入れてたら下記でも出来る。

tree | tail -n 1

ファイルの先頭からn行目までを別ファイルに上書きor追記

# input.txtの先頭5行をoutput.txtに上書き
tail -n 5 input.txt > output.txt
# input.txtの先頭5行をoutput.txtに追記
tail -n 5 input.txt >> output.txt

逆にファイルのn行目から末尾までの場合は以下

# input.txtの11行目から末尾までをoutput.txtに上書き
tail -n +11 input.txt > output.txt
# input.txtの11行目から末尾までをoutput.txtに追記
tail -n +11 input.txt >> output.txt

合わせ技
n行目からm行目までの場合

# input.txtのn行目からm行目まで出力してoutput.txtに上書き
# tail -n +N input.txt | head -n -(M-1) > output.txt

# input.txtの3行目から5行目まで出力してoutput.txtに上書き
tail -n +3 input.txt | head -n 4 > output.txt 

パス出力を改行して表示

echo $PATH | tr ":" "\n"
# --出力結果例--
#/usr/local/bin
#/usr/bin
#/bin
#/usr/sbin
#/sbin

小文字、大文字変換

#input.txtの小文字 -> 大文字でoutput.txtに上書き
cat input.txt |tr '[a-z]' '[A-Z]' > output.txt

#input.txtの大文字 -> 小文字でoutput.txtに上書き
cat input.txt |tr '[a-z]' '[A-Z]' > output.txt

任意の数字一覧を出力

# 12 13 22 23 32 33と出力
echo {1..3}{2..3}
# 00:00 00:01 00:02 00:03 ... 23:59と出力
echo {0..1}{0..9}, 2{0..3}:{0..5}{0..9}

Bashのブレース展開で00:00から23:59まで

下記のようにすれば各数字を改行してくれる。

echo {1..3}{2..3} |tr " " "\n"

改行コードを変換

cat ファイル名 | tr "\r\n" "\n"

一定容量を持つフォルダを昇順表示

#ルートディレクトリ以下で1~3GBのフォルダ一覧を昇順表示
sudo du -h / | grep  -E '^ *[1-3]+\.?[0-9]+G' | sort

n進数->10進数変換

# 2進数
echo $((2#101))
# 16進数
echo $((16#afaf))

Bashでn進数を扱うには

見つかったファイルに対して適時シェル実行

# カレントディレクトリ以下のファイルに全て.txtをつけて作成
for val in `find ./*`; do cat $val > $val.txt; done

このfor i in *; do ...; done;技は色々な所で使えて便利!
ファイル名一括置換

これからこういう技を覚えていきたい方に

個人的にはこの漫画形式の本で覚えるのが一番入門しやすかったです。業務の実用目的とコマンドの意味も説明してくれます。初心者にお薦めの一冊。
image
シス管系女子

また、下記のような記事を見ておけば今回使ったコマンドの意味もより詳しく理解出来ると思います。
今更ながら抑えておきたいシェルスクリプト用チートシート

更に濃いインフラになるには下記がおすすめ。
インフラエンジニアとしてよく使うコマンド集

その他勉強に使ったサイトなど。
UNIX/基礎知識/リダイレクト、パイプ