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/基礎知識/リダイレクト、パイプ