非インフラエンジニアが最低限知っておきたいLinuxコマンド

9年間Linux、Unix上で動くJavaやらCで書かれたクライアントアプリ、WEBアプリを開発してきたプログラマーがよく使用してきたLinuxコマンドのまとめです。
各コマンドの詳細な説明は、インターネット上に情報がたくさんあるので触れません。
（パイプも使いますがこのページ上では特には触れません）

# 想定読者
* Windows上で動くアプリをずっと作ったり、保守してきたからLinuxとか分からん。けど、最近Linux上で動くアプリの開発が増えているので、多少は覚えておかないとやばいかも知れないと思っている人。
* 今現在Linuxで動くためのアプリを作っている。が、開発はWindows上のみ。この先の工程はLinux上にアプリを置いてテストするけど、何かあったときにログなど見たい、採りたい。けどコマンドが分からない、な方。
* どんなコマンドがあるかも分からんわ！な方。

## cd
Windowsにもあるやつです。
カレントディレクトリを移動します

## ls
Windowsでいうところのdirコマンドです。
ファイルやディレクトリの所有者、権限を一覧表示するコマンドです。
cdしたらとりあえずlsコマンドもセットで打ってます。

```lang:基本的な使い方
# ファイル、ディレクトリ、隠しファイルを出力
ls -la
# ファイル、ディレクトリを更新時間の古い順に並べて一覧表示
ls -lrt
```

## which
引数に与えたコマンド名にPathが通っていればどこにあるかを出力してくれます。
探しもののプログラムがどこにあるのか知りたい場合はとりあえずこれを叩いてみましょう。

```lang:基本的な使い方
which java
```

## watch
簡易的に定周期で何かのコマンドを実行したい場合に使用すると便利です。

```lang:基本的な使い方
# 1秒間隔でdateコマンドを実行する
watch -n 1 date
```
１秒未満の周期にはできないので、もっと少ないスパンでコマンドを叩きたいと云った場合は、
シェルスクリプトを作るなりしましょう。

## su
スーパユーザ（Windowsで云うところのadministrator）への切り替え
個人で立てたLinuxサーバで遊ぶ分には、suでユーザを切り替えて作業した方が楽です。

## cp
ファイル、ディレクトリのコピーコマンドです。

```lang:基本的な使い方
# ファイルの属性（所有者や更新時刻）を保ってコピー
cp -p コピー元ファイル コピー先ファイル名

# ディレクトリとその配下のファイルの属性（所有者や更新時刻）を保ってコピー
cp -rp コピー元ディレクトリ コピー先ディレクトリ
```

## mv
ファイル、ディレクトリの移動コマンドです。

```lang:基本的な使い方
mv 移動元ファイル、ディレクトリ 異動先
```

## grep
　Windowsユーザにもコマンド名はおなじみだと思います。
　ファイル内検索をするコマンドです。

```lang:基本的な使い方
grep 検索文字 ファイル名
```

```lang:使用頻度の高い使い方
私はfindコマンドと絡めて使うことが多いです。

find . -name "¥ファイル名のパターン" -print | xargs grep --file=パターンファイル名

ex) find . -name ¥*.java -print | xargs grep --file=パターンファイル名
```

## top
　WindowsでいうところのタスクマネージャをCUIで表示したようなものです。
　システム全体のメモリ使用料や負荷状況などが見れます。
　私は主に、JavaのCPU、メモリの使用率、メモリの予約領域なんかを確認するのに使用しています。
　私はオプションは特に付けないですが、topをたたいた後で「Ctrl + M」などして並べ替えしています。

## netstat
　portの使用状況を確認するのに使います。
　Windowsでも同じコマンド名であったかと。（多分）

```lang:使用頻度の高い使い方
netstat -aon | grep port番号

ex) ORACLEとの接続を確認したい場合
netstat -aon | grep 1521
```

## find
　ファイルの検索で使用します。
　上述のとおりでgrepコマンドと組み合わせて使うことが多いです。

## vim、vi、view
　超高機能な標準エディタです。
　日頃Unix系を触っていて使えない人はいないんじゃないでしょうか。
　日頃こっちに慣れている人は、WindowsでもVimを入れて使用している人が多いように感じます。（私も入れてる）
　使い慣れると最強だと思いますが、いかんせん学習コストが高いのでUnix系経験者以外が使用しているところは今迄見たことがないです。
　ちなみにvimとviはファイル編集を、viewは読み込み専用一時ファイルとして開きます。
　viとvimも使い出すとできること、できないことがあるみたいですが、いまだにこの２コマンドの違いで困ったりしたことはないです。（多分使いこなしきれていないため）
　注意点としては、サイズの大きいファイルを開くとあっという間にメモりを喰い潰すので、本番環境などで使ってはいけません。

## cat
　テキストファイルの内容を出力します。
　複数ファイルの中身を連結したいときによく使用します。

```lang:基本的な使い方
cat ファイル名 > リダイレクト先ファイル

ex) cat *.log > xxxx.log
```

むかし朝っぱらに夜に吐いてたログを見るのに、
moreコマンド(1ページ分出力)と組み合わせて使ったりもしました。
```lang:moreと組み合わせた使い方
cat ファイル名 | more
```

ちなみに、どでかいファイルをcatでmoreを使わずに出力すると
CPU使用率が100%に張り付いたりするので、やっぱり本番環境では使用に注意してください。

## tail
テキストファイルの末尾を表示するコマンドです。
主にログの垂れ流ししながらアプリの動作確認を使用するのに使うことが多いです。

```lang:使用頻度の高い使い方
fail -f ファイル名
```

また、直近のログをとりあえず確認したいといったときに以下のようにして使用することも多いです。

```lang:使用頻度の高い使い方
fail -n 出力する末尾からの行数 ファイル名

ex) ログの内容をケツから1000行欲しい場合
tail -n 1000 error.log > error.log
```

## scp
sshを使用してセキュアにファイル転送を行うコマンドです。

```lang:基本的な使い方
scp -p "転送元ファイル名" "IPアドレス":"転送先ファイル名"
scp -rp "転送元ディレクトリ" "IPアドレス":"転送先ディレクトリ"

ex) カレントディレクトリのログファイルを192.168.0.1の同一ユーザホームディレクトリのwork/log下に保存
scp -p *.log 192.168.0.1:~/work/log

```

本番環境などからファイルを転送させる場合、ネットワークに負荷をかけてアラートが上がるのも面白くないので、帯域制限をかけて使用することも多いです。

```lang:帯域制限をかける場合
scp -l 制限 "転送元ファイル名" "IPアドレス":"転送先ファイル名"
制限の単位はkbit/secで指定します、

scp -l 800
と書くと、100kB/secで転送してくれます。
```

最終的に普段実作業をしているWindowsにファイルを落としてきたい場合は、WinSCPなどのWIndows向けSCPクライアントを使用して落としてきます。

ちなみにですが、scpコマンドでファイルを転送した場合に、転送先に既に転送先ファイル名のファイルがあり、そのファイルが誰かによって書き込まれるようなシーンがある場合、編集とぶつかるとファイルが破損する可能性があるので注意が必要です。
（システムに組み込もうとしない限りは気にする必要はないですが一応）

## rsync
ファイル同期コマンドで、基本的にscpと同じことができ、使い方も同じです。
が、scpとは以下の点で異なります。
rsyncは、実ファイルを一時ファイルに落とした上でファイルを書き出し、転送が終わり次第実ファイルに反映されます。
ので、メモリは相応に喰ってしまいますが、scpと違って編集に対して安全にコピーは行えます。
システムに組み込むならscpではなく、rsyncで。

ちなみに、rsyncはローカル端末内にでも使用可能です。

## ssh
この前投稿されていたので、そちらのリンクを貼ります。
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)

## ps
プロセス確認のコマンドです。
生存確認や、プロセス強制終了させたいからプロセスIDを知りたいときによく使います。

```lang:基本的な使い方
ps -ef | grep プロセス名

ex) javaのプロセスが知りたい場合
ps -ef | grep java
```

## pgrep
プロセスIDが重複していなくて、プロセス名も分かっているときはこっちでも良いです。
プロセスに対応するプロセスIDを返してくれます。

```lang:基本的な使い方
pgrep プロセス名
```

## traceroute
Windowsでいうところのtracertコマンドです。
通信経路が調べられます。
pingを打って帰ってこなかった場合に、通信がどこまで通っているかを確認するのによく使います。
（そこから先はインフラ屋さんに投げてます。

```lang:基本的な使い方
traceroute hostのipアドレス
```

## ln
ファイル、ディレクトリへのリンクを貼ります。
バージョンの切り替えを容易にするために、よく使います。
シンボリックリンクを貼るコマンドを覚えておけばOK。

```lang:基本的な使い方
ln -s "リンク先ファイル or ディレクトリ" "リンク名"
ex)jdk1.8_XXをlatestという名前でリンクさせる
ln -s /usr/local/java/jdk1.8_XX latest
# 上記のようにするとコマンド実行したディレクトリにlatestができ、その実態は/usr/local/java/jdk1.8_XXを見に行くようになる
```

## ifconfig、ip
Windowsのipconfigと同じです。
Redhat 7より小さいバージョンはifconfigコマンドが、
7より大きいバージョンの場合はipコマンドがデフォルトで入っています。
ipコマンドの場合は、サブコマンドが何個かあり、ifconfig相当のことを行いたい場合は、
ip addr と打って実行します。

## init
シャットダウンなどのコマンドです。
もうどうしようもないから再起動したいとなった場合は、以下で再起動を。
※共用、本番環境では間違っても勝手に実行することのないように。

```lang:基本的な使い方
# 再起動
init 6

# シャットダウン
init 0
```

## tar
ファイルの所有者、権限、シンボリックリンクを保持した状態でアーカイブするコマンドです。
Unix上でアーカイブする場合は、zipコマンドなどは使わずに常にtarコマンドを使用した方が個人的には良いかなと思います。
一時的にWindowsに持ってきても上記の情報が消えないためです。
zipコマンドだとWindowsに持ってきた時点で上記の情報が消えるので、再度Linuxに展開した場合に実行権限与えたりなんだりという手間がかかるようになっていまいます。（場合によっては復元の仕方が分からなく、ギブアップすることにもなりえます）
よってLinuxではtarコマンドだけを使いましょう。

```lang:基本的な使い方
# ZIP圧縮してアーカイブ
tar cvzf "圧縮ファイル名".tar.gz "圧縮対象ディレクトリ"
# アーカイブを展開
tar xvf tarファイル名
```

## sed
Linuxで文字列操作するときに使用するコマンドです。
以下のページの説明が分かりやすいのでリンク貼ります。
[sedの解説](https://hydrocul.github.io/wiki/commands/sed.html)

## awk
コマンドではなく、プログラム言語ですが覚えていると便利です。
イメージとしてはsedの強化版です。
このコマンドを使いこなせると、Linuxを使っているプロジェクトにちょっとヘルプへ逝ってこいと言われた場合に、経験上行った先でものすごく重宝されることが多いです。

sedの解説ページと同じ人の書いたページが分かりやすいと思います。
[awkの解説](https://hydrocul.github.io/wiki/commands/awk.html)

# 終わりに
Advent Calendarに参加してみたいよ〜！ってことでノリで書いてみましたが、
知っておいた方が良いだろうというコマンドが案外多くて最後は息切れしました。。
リソースと権限周りのコマンドに触れてませんが、非インフラな人のコマンドなので良いかなと。（土曜が終わるまでにめげずに加筆するかもです）

Linuxのコマンドは強力なものが多いので、Windowsでも使いたくなるかもしれません。
そんなときは[Gow](https://github.com/bmatzelle/gow/releases)をインストールしてみてはどうでしょうか。
Cygwinなどと違って軽量ですぐにインストールが終わるので、実行できるようになるまでが手間ではないです。
使えないコマンドもありますが、非常に重宝しています。
（軽量でもっと良いツールがあったら教えてください）