仕事中にこれ知ってたら便利だなーと思うものを集めてみました。
自分にとってのメモ帳代わりにしようと思うので、今後もどんどん増やしていく予定。
任意のディレクトリ以下のファイルを検索する
# カレントディレクトリ以下の全ファイルから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
hello
world
コマンド実行
cat << EOF > sample.txt
goodbye
task
EOF
after
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}
下記のようにすれば各数字を改行してくれる。
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))
見つかったファイルに対して適時シェル実行
# カレントディレクトリ以下のファイルに全て.txtをつけて作成
for val in `find ./*`; do cat $val > $val.txt; done
このfor i in *; do ...; done;
技は色々な所で使えて便利!
ファイル名一括置換
これからこういう技を覚えていきたい方に
個人的にはこの漫画形式の本で覚えるのが一番入門しやすかったです。業務の実用目的とコマンドの意味も説明してくれます。初心者にお薦めの一冊。
シス管系女子
また、下記のような記事を見ておけば今回使ったコマンドの意味もより詳しく理解出来ると思います。
今更ながら抑えておきたいシェルスクリプト用チートシート
更に濃いインフラになるには下記がおすすめ。
インフラエンジニアとしてよく使うコマンド集
その他勉強に使ったサイトなど。
UNIX/基礎知識/リダイレクト、パイプ