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

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


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

### 任意のディレクトリ以下の画像ファイルを見つけて指定したディレクトリに全てコピー
```sh
# pictureフォルダ以下のjpgファイルを見つけてデスクトップ以下にコピー
find ./picture -name '*.jpg' | xargs -J% cp -f % ./cpy
```

### ディレクトリ構造をコピー
```sh
tree |pbcopy
# 以下のような出力をコピー出来る
# /Users/xxx/yyy/
# ├── memo.txt
# ├── dododo.txt
# └── script.rb
```
### 空のファイル作成
```sh
# xxx.txtというファイルを作成
touch xxx.txt
```

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

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

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

```sh
cp /dev/null sample.txt
```
or

```sh
echo -n > sample.txt
```

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

```sample.txt
hello
world
```
コマンド実行

```sh
cat << EOF > sample.txt
goodbye
task
EOF
```
after

```sample.txt
goodbye
task
```
補足：以下でも同じようなことが出来ます。

```sh
> sample.txt
goodbye
task
```

### 複数ファイル、フォルダを一括作成等
```sh
# 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割増しな楽しいコマンドライン生活](http://qiita.com/izumin5210/items/a09f27a22346b8909fe1)

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

### ランダム文字列を生成
```sh
head /dev/urandom | shasum |cut -f 1 -d ' '
```
[シェルのワンライナーの再利用性を高めるたった一つの方法](http://labs.timedia.co.jp/2011/12/improve-reusability-of-shells-command-line-history.html)

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

```sh
# 0~99999まで
echo $RANDOM
# 出力結果例：273
```

### 今日の日付を取得
```sh
# 2014 12 27
date '+%Y %m %d'
# 2014-12-27
date '+%Y-%m-%d'
```

### 定期的にコマンド実行
```sh
# １秒ごとに`say hello`を実行
while true; do `sleep 1; say hello`; done
```

### ファイルの中をソートして重複行を削除
```sh
# sample.txtの重複行を削除
sort sample.txt -uo sample.txt
```
ソートせずに実行したい場合はawkコマンドがおすすめ。

```sh
# sample.txtの重複行削除
awk '!val[$0]++' sample.txt
```
[ソートしないで重複行を削除する](http://qiita.com/arcizan/items/9cf19cd982fa65f87546)

### 任意のディレクトリのファイル数をカウント
```sh
ls -F |grep -v / |wc -l
```
任意のディレクトリ以下のファイル数をカウントするときは以下

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

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

```sh
tree | tail -n 1
```

### ファイルの先頭からn行目までを別ファイルに上書きor追記
```sh
# input.txtの先頭５行をoutput.txtに上書き
tail -n 5 input.txt > output.txt
# input.txtの先頭５行をoutput.txtに追記
tail -n 5 input.txt >> output.txt
```


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

```sh
# 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行目までの場合

```sh
# 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 
```

### パス出力を改行して表示
```sh
echo $PATH | tr ":" "\n"
# --出力結果例--
#/usr/local/bin
#/usr/bin
#/bin
#/usr/sbin
#/sbin
```

### 小文字、大文字変換
```sh
#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
```

### 任意の数字一覧を出力
```sh
# 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まで](http://qiita.com/mutz0623/items/f46f18abd51809d8959d)

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

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

### 改行コードを変換
```sh
cat ファイル名 | tr "\r\n" "\n"
```

### 一定容量を持つフォルダを昇順表示
```sh
#ルートディレクトリ以下で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進数を扱うには](http://qiita.com/kawaz/items/b29eef5e1934b1995949)

### 見つかったファイルに対して適時シェル実行
```sh
# カレントディレクトリ以下のファイルに全て.txtをつけて作成
for val in `find ./*`; do cat $val > $val.txt; done
```
**この`for i in *; do ...; done;`技は色々な所で使えて便利！**
[ファイル名一括置換](http://qiita.com/miyatahirotaka/items/d3b1302ab9fcf0337b13)


## これからこういう技を覚えていきたい方に
個人的にはこの漫画形式の本で覚えるのが一番入門しやすかったです。業務の実用目的とコマンドの意味も説明してくれます。初心者にお薦めの一冊。
![image](https://qiita-image-store.s3.amazonaws.com/0/16795/f5eb4528-7729-1ce8-b2cd-859da1164881.png)
[シス管系女子](http://www.amazon.co.jp/%E3%82%B7%E3%82%B9%E7%AE%A1%E7%B3%BB%E5%A5%B3%E5%AD%90-%E3%81%BE%E3%81%A8%E3%82%81%E8%AA%AD%E3%81%BF-Piro%EF%BC%88%E7%B5%90%E5%9F%8E%E6%B4%8B%E5%BF%97%EF%BC%89-ebook/dp/B00HFLGJMK/ref=kinw_tu_recs_2)

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

更に濃いインフラになるには下記がおすすめ。
[インフラエンジニアとしてよく使うコマンド集](http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079)

その他勉強に使ったサイトなど。
[UNIX/基礎知識/リダイレクト、パイプ](http://technique.sonots.com/?UNIX%2F%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%2F%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%80%81%E3%83%91%E3%82%A4%E3%83%97#v49ead61)