Linuxの基礎

#仮想環境を作ろう

https://www.sejuku.net/blog/86137

上記を参考にdockerで作れる。

docker exec -it mycentos /bin/bash

で中に入って作業できるよ。

docker stop mycentosでコンテナを停止できるよ。

docker start mycentosで一度作ったコンテナを起動できるよ。

docker ps -aで停止しているコンテナを表示。

docker rm コンテナIDでコンテナのイメージを削除できるよ。


#基礎知識

・現在自分が位置しているディレクトリをカレントディレクトリ、またはワーキングディレクトリと呼ぶ。


・ルートディレクトリを起点としてファイルやディレクトリのパスを示すことを絶対パス、もしくはフルパスと呼ぶ。

・逆にカレントディレクトリを起点として表記されるパスを相対パスと呼ぶ。

・ .　カレントディレクトリ

・ .. 親ディレクトリ

・ ../.. 親の親ディレクトリ

・ ./home/file-1  カレントディレクトリの下にあるhomeディレクトリの中にあるfile-1を示す



プロセス: Linuxカーネルから見た処理の単位。
ジョブ: シェルから見た処理の単位。
コマンドを３つパイプした場合、プロセスは3つなのに対し、ジョブは1つ。コマンドラインに入力している1つの行が1つのジョブ。



/dev/null  入力先として指定しても何も返さない。出力先として指定しても書き込んだデータは消えて無くなる。標準エラーメッセージだけは画面に表示される。コマンドの表示結果が大量にある時に使うと便利。



パイプライン: コマンドの標準出力を別のコマンドの標準入力につなぐ。lsコマンドの表示結果をlessコマンドで見るなど。


複数のファイルやディレクトリをまとめたファイルをアーカイブファイルと呼ぶ。
それを圧縮したものを圧縮ファイルと呼ぶ。








#便利な操作方法

Ctrl + k  カーソル位置から行末までを削除する

Ctrl + u  カーソル位置から行頭までを削除する

Ctrl + y  最後に削除した内容を挿入する

Meta + b  一つ前の単語に移動

Meta + f  一つ後の単語に移動


Ctrl + s  キー入力を受け付けなくする

Ctrl + q  キー入力を再開する

Ctrl + c  実行中のコマンドを強制終了する

Ctrl + l  画面をきれいにする/clearコマンドと同じ

reset　　　Ctrl + lでも文字化けが直らない時にやってみる

tabキーを2回　候補のコマンドを全て表示することができる

Ctrl + r  インクリメンタル検索をすることができる

Ctrl + g  検索結果を破棄してプロンプトに戻る



#Linuxコマンド集

pwd 　　カレントディレクトリを確認する

ls /usr  usrディレクトリ内のファイル一覧を表示する

ls /usr /tmp  usrディレクトリとtmpディレクトリ内のファイル一覧を表示する

ls -l  ファイル名だけでなくファイル属性などの詳細情報を一緒に表示する
表示された最初の文字がdならディレクトリ、-なら通常ファイルと覚えておこう。

ls -a  隠しファイルも含めて表示する。基本的にはlsだけだと.から始まるファイル名は表示されない。

ls -F  ファイル種別を含めて表示する。なし:通常ファイル, /:ディレクトリ, *:実行可能ファイル, @:シンボリックリンク

ls -a -F /  このようにオプションを2つ重ねて、さらに/という引数を取ることもできる。

ls -w 30  30桁で表示する

ls --quote-name  ファイル名を""で囲んで表示する

mkdir work  workディレクトリを作成する

mkdir -p report/2014/01  -pオプションをつけることで、一気に階層の深いディレクトリを作成することができる。

touch ファイル名  新しいファイルを作成する。

touch file1 file2  複数のファイルを一度に作成可能

rm ファイル名  ファイルを削除する

rm file1 file2  複数のファイルを一度に削除可能

rm *.html  拡張子.htmlのファイルを一度に削除できる

rm file*  fileとつくファイルを一度に削除することができる

rm -r ディレクトリ名  ディレクトリとその下のファイルを全て削除する

rm -i ファイル名　　削除確認をしてくれる

rmdir 空のディレクトリを削除する。中身がある場合はエラーになる

cat /etc/hosts /etc/hostname   hostsとhostnameというファイルの中身を表示する

cat -n ファイル名　　行番号付きでファイルの中身を表示する

catコマンドを引数抜きでenterするとキーボードからの入力を表示するモードに変わる。それを終了させたい時はCtrl + dを押す。

less ファイル名  指定したファイル名を１画面いっぱいに表示することができ、上下にスクロールできる。catコマンドだと1画面に収まり切らなそうな時に使う。

cp file1 file2  file1をfile2という名前でコピー

cp file1 file2 file3 dir2  3つのファイルをコピーしてdir2というディレクトリに入れる

cp *.txt backupdir  拡張子.txtのファイル全てをbackupdirにコピーする

cp -i file1 file2  もしディレクトリ内にfile2が既に存在している場合だけ、上書きしていいか確認してくれる

cp -r dir2 dir3  dir2を中身も含め全てdir3としてコピーする

cp -r dir2 dir3  既にdir3があった場合は、dir2が中身ごとdir3の下に配置される

mv file1 file2  file1をfile2という名前に変える

mv file1 dir1  file1をdir1に移動する

mv file1 file2 file3 dir1  3つのファイルをdir1に移動する

mv -i file1 file2  既にfile2が存在している場合は上書きして良いか確認してくれる

mv dir1 dir2  dir1の中身ごとdir2の中に移動させる

ln file1 file2  ハードリンクを作成する。別のコマンドでfile2を指定するとfile1にアクセスできるようになる。例えばcat file2とするとfile1の中身が表示される。つまりファイルに別名をつけるコマンド。

ln -s file1 file2  シンボリックリンクを作成する。ls -lでファイルにシンボリックリンクがあるかどうか確認できる。

ln -s dir1/dir2 syouryaku　　このように深い階層にあるディレクトリにシンボリックリンクを付けておくとすぐに移動することができる。

unlink syouryaku  シンボリックリンクを消すことができる。syouryaku/では消えないのでご注意。

find . -name file1.txt -print  カレントディレクトリの下にあるfile1-txtというファイルのパスを全て表示する。

find . -iname file1.txt -print　大文字小文字の区別なく検索する

find . -name '*.txt' -print  カレントディレクトリ下にある拡張子が.txtのファイルを全て表示する(必ず*か?を使う時は''で囲むこと)

find . -type d -print  カレントディレクトリ下にある全てのディレクトリのパスを表示する(d:ディレクトリ, f:通常ファイル, l:シンボリックリンク)

find -type f -a -name 'file*' -print  カレントディレクトリ以下の通常ファイルでfileとつく名前のパスを全て表示する。-aはANDを意味し複数の検索条件を指定することができる。

locate 文字列  任意の文字列を含むパス名を全て表示することができる。カレントディレクトリではなく、ルートディレクトリ下から検索される。(locateコマンドをインストールしてupdatedbコマンドを事前に打つ必要がある)

locate -i FiLe1  大文字小文字関係なくfile1とつくパスを全て表示する

locate -b file1  -bとつけるとファイルに絞って検索することができる。ディレクトリは検索されない。

locate file1 file2  file1かfile2どちらかの名前が含まれているパスを全て表示する

locate -A dir2 file1  dir2とfile1どちらの名前も含まれているパスを全て表示する

コマンド --help 　そのコマンドの使用を表示する

which コマンド　　コマンドを入力する時、シェルが実際にどのファイルを実行するかを確認する

alias 名前='コマンド'  長いコマンドにエイリアスを設定することができる

type コマンド名　　エイリアスの場合どのコマンドのエイリアスなのかを表示してくれる

unalias エイリアス名　　エイリアスを削除する

/bin/ls  コマンドのフルパスを指定すると、一時的にエイリアスを無効にしてコマンドを実行することができる

command ls  同じくエイリアスを一時的に無効にできる

\ls  上と同じ。バックスラッシュはoption + ¥ 

set
shopt  bashの設定を変更できる。p134

var1='test variable'  シェル変数を設定。値に空白が入る時は''で囲む必要がある。変数を設定する時に=の左右にスペースをつけてはいけない。

echo $var1  $変数名という形で参照することができる。

PS1='任意の文字列'  プロンプトに表示する文字を設定することができる

PS1='[yokotabash] \w \$ ' このようにするとカレントディレクトリを追加で表示してくれる。\wがカレントディレクトリを指す。さらに詳しい設定方法はp137

printenv  現在シェルに設定されている環境変数を表示する

source ~/.bashrc  ファイルの内容を読み込んで実行できる。この場合、.bashrcファイルの設定を即座に反映させることができる。

ls -ld dir1  ディレクトリのパーミッションを確認する

chmod [ugoa] [+-=] [rwx] <ファイル名>  権限を与えるコマンド。u:オーナー, g:グループ, o:その他のユーザー, a:ugo全て

chmod 8進数の数値 <ファイル名>  元のパーミッションに関わらず新しいパーミッションの値へと変更する。r:4:読み取り, w:2:書き込み, x:1:実行となる。　p158

su  スーパーユーザの略。一般ユーザでログインしてる時に、一時的にスーパーユーザとして作業したい時にsuと打つ。スーパーユーザとして作業を終えたら、exitコマンドで元の一般ユーザに戻ることができる。

su -  環境変数などをスーパーユーザのそれに初期化してユーザを切り替えることができる。

sudo  別のユーザとしてコマンドを実行するために利用される。つまり一般ユーザでログインしてる時に、スーパーユーザでないと実行できないコマンドを実行するために使う。sudoの場合、実行したコマンドが終了すれば元の一般ユーザに自動的に戻る。ちなみにパスワードは今ログインしているユーザのパスワードを入力する。ユーザにsudoコマンドを許可するかは/etc/sudoersファイルに管理されている。(sudoersファイルを編集する時はp163,164を必ず読む)

ps  現在動作しているプロセスを表示する。(プロセスとは実行中のプログラムのこと)

ps xf  現在のユーザが実行中の全てのプロセスを表示

ps ax  システムで動作している全てのプログラムを表示する。Linuxはマルチタスク機能で様々なプログラムが同時に動作している。(psコマンドのオプション一覧はp171)

Ctrl + z  起動しているジョブを停止状態にする

jobs  現在のジョブを確認する

jobs -l プロセスIDも一緒に表示する

fg %ジョブ番号　　そのジョブを再開する

bg %ジョブ番号　　そのジョブをバックグラウンドにする

kill %ジョブ番号　　ジョブを終了させる。ジョブが終了すると、Terminatedというメッセージが表示される。

kill PID   同じくプロセスを終了させる。psコマンドでPIDを確認する。

cat < /ect/crontab  キーボードの代わりにファイルを標準入力につないでいる。結果はcatコマンドを普通に打った時と同じだが、入力リダイレクトの場合は、標準入力をそのまま標準出力しているのに対し、普通のcatコマンドの場合は「ファイル名が指定された場合はその内容を対象にする」という用意された動作をしている。

ls -l > list.txt  標準出力先を画面ではなくlist.txtというファイルに変更している。

ls /xxxxxx 2> list.txt  list.txtに標準エラー出力先を変更している。

ls /xxxxx > list.txt 2> error.txtというように書くことも可能。

ls /xxxx >  result.txt 2>&1  標準出力をリダイレクトした後に、2>&1と書くと標準出力と標準エラー出力をまとめて1つのファイルにリダイレクトできる。

echo >> number.txt  ファイルを上書きせずに、ファイル末尾に追記するようにする

ls -l | less パイプラインでlsコマンドの表示結果をlessで画面に表示できる

history ~/.bash_historyというファイルに保存されてあるコマンドライン履歴を表示することができる。

histroy | less 上記と同じ。

ls -l | cat -n | less パイプラインで3つのコマンドをつなげている。ただパイプラインは標準出力しか次のコマンドに繋げられないので、ls -l / /eeee 2>&1 | lessこのように書く必要がある。

ちなみに、catコマンドのように標準入力を入力として受け取り、標準出力に出力するコマンドのことをフィルタと呼ぶ。

head  ファイルの先頭から10行を表示するコマンド。

head -n 3  ファイルの先頭から3行を表示する。

tail  headコマンドの逆で末尾を確認することができる。

du -b ファイルorディレクトリ　　そのファイルのバイト数を表示する。

sort  ABC順に並べ替える。

sort -n  数値順に並べ替える。

tac  入力行の順序を逆にして表示する。

du -b /bin/* | sort -n | tac　　バイト数が小さい順に並べる。

wc  入力ファイルの行数、単語数、バイト数を表示する。(左から)

wc -l 行だけ
wc -w 単語だけ
wc -c バイト数だけ

ls . | wc -l  カレントディレクトリ直下のファイル、ディレクトリ数を数える。

ps | sort -k 4  縦の列の4行目を基準に並び替える

sort -r 逆順に並べる

ls -l . | sort -rn -k 6  カレントディレクトリ直下のファイルとディレクトリを縦6行目の数値を基準にして逆順で表示する。

uniq  同じ内容の行が連続している場合、重複を取り除く。

sort file | uniq  重複している要素が離れている場合は、一旦sortコマンドで調整してからuniqをすれば良い。uniqコマンドを使う時は常にsortコマンドとセットで使うことを念頭に。

sort -u file  重複行を取り除いて順番を揃える。sort file | uniqよりこっちの方が良さそう。

uniq -c  重複行を数えてその数を教えてくれる

sort file1.txt | uniq -c | sort -rn  file1の重複行を数えて、重複が多い順に並び替えて表示する。

cut -d : -f 7 /etc/passwd  :を区切り文字にして7つ目のフィールドを表示する。

cut -d : -f 1,6,7 /etc/passwd  このように複数のフィールドを指定することも可能。

tr abc ABC  文字を置き換える。aはAに。bはBにという感じ。あくまでも1文字単位の文字変換。文字列の置き換えは別のコマンドを利用する。trコマンドはファイル名を指定してもエラーになる。なので、catコマンドを使うか、tr a b < ./file1.txtのようにリダイレクトさせる。

tr -d 消したい文字　　-dをつけると指定した文字を削除して表示することができる。消したい文字の部分に\nを指定すると、改行を取り除いて1行で表示することができる。

tail -f ファイル名　　ファイルの内容が書き換えられると、追記された内容を表示する

diff 比較元ファイル　比較先ファイル　　ファイルの差を表示する。

diff -u 比較元ファイル　比較先ファイル  ユニファイド形式で表示する。githubみたいな感じ。

grep 検索パターン ファイル名　　そのファイルから検索パターンに一致する行を出力する。

grep -n 検索パターン ファイル名　　マッチした行の行番号を一緒に表示する

grep -i 検索パターン　ファイル名　　大文字小文字を区別しないでマッチさせる

grep -v 不要なワード　ファイル名　　不要なワードを除いてファイルの内容を表示させる

ls / | grep word  ファイル名を指定しない場合、標準入力から読み込ませることができる。

ls | grep '^file'  fileという文字から始まるディレクトリまたはファイルを表示する。
正規表現を使用する場合は''で囲む必要あり。

grep 't.st' example.txt 　tで始まりstで終わる4文字のワードを検索する。.は任意の1文字という意味がある。

.そのものを検索したい時は、ドットの前に\を付ける。

.ではなく、[]に含まれるいずれかの1文字。

[^文字][]の中に含まれないいずれかの1文字。

grep 'file[1-3]' number.txt   file1,file2,file3があれば表示する

grep 'file[^13]' number.txt   fileがついて、file1,file3,file13以外を表示する

grep '^txt' file1.txt  先頭がtxtで始める行のみを抜き出す。.txtなどは除外できる。^は行頭を意味する。

grep 'txt$' file1.txt  行末がtxtとつく行のみを抜き出すことができる。$は行末を意味する。また、^$は空行を意味する。-vオプションを使って空行だけを除いて表示することができる。

*  0回以上の繰り返しを表すメタ文字
grep 'be*r' txt.html  brやber,beerなどが表示される。
grep 'b[ea]*r' txt.html  br,bear,beerなどが表示される。

.*  任意の文字が0回以上繰り返されているという意味。あらゆる文字列にマッチする。
grep '^ex.*txt$' file.txt  exで始まってtxtで終わる行を全て表示する。

拡張正規表現　　基本正規表現よりも使えるメタ文字を増やしたもの。-Eオプションをつけて使う。

+  拡張正規表現のメタ文字。直前の文字の1回以上の繰り返しを意味する。
grep -E 'be+r' txt.html　　ber,beer,などが表示される。

?  拡張正規表現のメタ文字。直前の文字の0回または1回の繰り返しを意味する。
grep -E 'be?r' txt.html  br,berが表示される。

{m,n}  拡張正規表現のメタ文字。直前の文字のm回以上n回以下の繰り返しを意味する。
grep -E 'be{1,2}r' txt.html  ber,beer,beerbeerなどが表示される。

{m}  拡張正規表現のメタ文字。直前の文字のm回の繰り返しを意味する。
grep -E 'be{1}r' txt.html  berが表示される。
[0-9]{3}-[0-9]{4}とすると郵便番号の桁のチェックなどができる。

{m,}　　拡張正規表現のメタ文字。直前の文字のm回以上を意味する。

(文字)  拡張正規表現のメタ文字。単語をグループするためのメタ文字。
grep -E '(wine){2,}' txt.html  wineという文字が2回以上繰り返されるものを表示する。

abc|xyz  拡張正規表現のメタ文字。複数の単語をOR条件でつなげるメタ文字。多くの場合は()とセットで使われる。
grep -E 'my(water|wine)' txt.html　　mywater,mywineが表示される。

sed 1d txt.html  txt.htmlの1行目を削除したものを表示する。sedは元のファイルを上書きすることはない。sedは非対話型エディターである。1の部分をアドレスと呼ぶ。

sed 1,5d txt.html  txt.htmlの1~5行目までを削除したものを表示する。

sed '3,$d' txt.html  txt.htmlの3~最終行までを削除したものを表示する。アドレスに$を指定すると最終行を意味する。

sed d txt.html  txt.htmlの全ての行を削除する。アドレスを省略すると、コマンドは全ての行に作用する。

sed /^b/d txt.html  txt.htmlの先頭がbで始まる行を削除したものを表示する。アドレスに正規表現を使う時は/で囲んであげる。

sed 1p txt.html  txt.htmlの1行目を表示する。+パターンスペースを表示する。

sed -n 1p txt.html  パターンスペースを除いて1行目だけ表示する。

sed 's/beer/whisky/' txt.html  txt.htmlのbeerという単語をwhiskyに置換したものを表示する。ただ、beerbeerはwhiskybeerという風にしか変わらない。行頭から探して最初に見つかった文字列だけを置換する。

sed 's/beer/whisky/g' txt.html  見つかった全ての文字列を置換するにはgフラグを付ける。これで、txt.htmlのbeerという単語全てがwhiskyに置換され、それが表示される。

sed 's/b.*r/whisky/g' txt.html  txt.htmlのbで始まりrで終わる単語全てをwhiskyに置換したものを表示する。

sed 's/b//g' txt.html  置換後の文字列を指定しないことで、txt.htmlのbを全て削除している。

sed -n 's/b//gp' txt.html  置換が発生した行だけ表示している。-nオプションでパターンスペースを非表示にし、pフラグで置換が発生した部分だけ表示できる。

sed -r 's/be+r/whisky/' txt.html  sedで拡張正規表現を使うには-rを指定する。

sed -r 's/my(.*)/--\1--/' txt.html   ()でグループ化して\1でそれを参照することができる。この場合、myappleが--apple--と置換される。

sed '1,2s/beer/whisky/g' txt.html   txt.htmlの1~2行目の範囲でbeerをwhiskyに置換したものを表示する。

/という文字そのものを指定するには、\/と表記する。もしくは
sed 's!beer!/beer/!g' txt.htmlというように区切り文字を/から!に変えて書く。

ls -l | awk '{print $5,$9}'  lsコマンドで表示される行の5と9行だけを表示する。ちなみに1~9行目までの全ての列を指定するには$0とする。

ls -l | awk '{print $5$9}'  表示されるレコードが空白で区切られてないものになる。

$NF  awkで使う組込変数。$NFをprintすると最後のフィールドが表示される。

ls -l | awk '{print $(NF-1)}'　最後から2番目のフィールドが表示される。

ls -l | awk '$9 ~ /^fi/ {print $5,$9}'  9個目のフィールドで、先頭がfiで始まるレコードに対して、5と9フィールドを表示する。正規表現との比較は~を使用する。正規表現のパターンは//で囲んで指定する。

ls -l | awk '/^d/ {print $5,$9}'  比較対象を指定しないと、レコード全体が比較対象になる。

ls -l | awk '/^d/'  アクションを省略すると{print $0}が実行される。この場合、フィールド全体でdから始まる全てのレコードを表示する。

awk -F, '{sum += $NF} END{print "Average:",sum/NR}' score.csv   まず、-F,でフィールド全体の区切り文字を空白から,に変更する。次にsumという変数を作成し、そこに全員の点数を足していく。ENDブロックに書かれた処理は最後に実行される。NRは行数を取得できる組込変数。合計点をレコードの行数で割って平均点を出すことができる。

cat average.awk
=> {sum += $NF} END{print "Average:",sum/NR}

awk -F, -f average.awk score.csv
=> 平均点

上記のように作ったawkスクリプトを.awkファイルに保存して、-fオプションでいつでも再利用することができる。


tar cf dir1.tar dir1  dir1下のディレクトリまたはファイルをdir1.tarというアーカイブファイルにまとめる。cfはcreate fileの略。

tar tf dir1.tar  dir1.tarというアーカイブファイルの中身を確認する。tはlistのtらしい。

tar xf dir1.tar  dir1.tarファイルを展開して取り出すことができる。xはextractのx。展開されるファイル名と同じファイル名が存在する場合は上書きされてしまうので注意。

tar cvf dir1.tar dir1  cfと一緒に対象になったファイル一覧を表示することができる

tar tvf dir1.tar  tfと一緒に、ls -lのようにパーミッションやオーナー、ファイル属性を表示してくれる

注意：rootユーザーではないユーザーがアーカイブを作成すると展開時に読み込み権限がなくファイルを展開できないなどの問題が発生するリスクがある。なのでrootユーザーでやると良い。アーカイブはタイムスタンプなどもそのままコピーするので、バックアップ向き。

gzip ps.txt  ps.txtを圧縮する。.gzという拡張子になる。

gzip -d ps.txt.gz  圧縮したファイルを元に戻す。

tar czf dir.tar.gz dir1  これはtarコマンドだけでアーカイブと圧縮を同時に行っている。cfの間にzオプションを挟む。

tar xzf dir.tar.gz  逆にアーカイブされ、圧縮されたファイルを展開して取り出している。

ちなみにbzip2というコマンドでもファイルを圧縮できるらしい。gzipよりも圧縮率が高くデータ量も小さくできるが、圧縮や展開に時間がかかる。xzコマンドはさらに圧縮できる。
zipコマンドはアーカイブと圧縮を同時に行う。多くのディストリビューションにはインストールされていないので、使う場合はzipとunzipコマンドをインストールする必要がある。

git log -p コミットごとの差分を含めて履歴を表示することができる。

git diff --cached 次にgit commit したときにリポジトリにコミットされる差分を表示します

https://qiita.com/shibukk/items/8c9362a5bd399b9c56be

上記の記事がgit diffについて詳しく書いてる。

git add -u 変更したファイル全てをindexにあげる。新規作成されて一度もコミットされていないファイルは対象外となる。


git revert コミットid　誤った内容をコミットしたときに、それを打ち消すことができる。ただ、履歴からなくなるわけではなく、打ち消したものをコミットするという流れになる。

git branch -d ブランチ名　ブランチを削除する。








































#vimの操作

:w 　ファイルを保存する。新規ファイルの場合はファイルを作成。既存ファイルの場合は上書き保存をする

:w ファイル名　名前をつけて保存する

:q!  上書き保存せずにvimを終了する

h  左に移動
j  下に移動
k  上に移動
l  右に移動
x  カーソルより右側の文字を削除する
i  insertモードに変える(カーソルの左側に文字)
a  insertモードに変える(カーソルの右側に文字)
w  次の単語の先頭に移動する
b  後ろの単語の先頭に移動する
W  スペース区切りで次の単語へ
B  スペース区切りで後ろの単語へ
0  行の先頭に移動
$  行の末尾に移動

gg 　ファイルの最初の行に移動
G  ファイルの最後の行に移動
20G  ファイルの20行目に移動
d$  行末までをデリート
d0  行頭までをデリート
dl  1文字デリート
dw  単語1つをデリート
dgg  最初の行までデリート
dG  最後の行までデリート
ヤンクの場合はdがyに置き換わる
yy  カーソルのある１行をコピーする
dd  カーソルのある１行をデリートする
J  カーソルのある行と1つ下の行を連結させる
u  直前の編集操作を取り消す(アンドゥ)
Ctrl + r  アンドゥを取り消すことができる(リドゥ)
/文字列  任意の文字列を検索してマーカーをつける
n  マーカーがついた状態の次の単語に移動する
N  マーカーのついた1つ前の単語に移動する
:noh  ハイライトを消す
:%s/置換前/置換後/g  文字列の置き換えをする




















#iTerm2の便利コマンド

Command + D→ウインドウを左右に分割する
Command + Shift + D→ウインドウを上下に分割する
Command + n→新しいウインドウを作成
Command + f→検索
Command + t→新しいタブを作成
Command + T→タブを複製する
Command + W→タブを削除する
Command + 矢印キー→タブを移動する
Command + Enter→全画面を表示させる
Command + [→次のウインドウへ移動
Command + ]→前のウインドウへ移動



#シェルスクリプト

簡単なファイルの作り方

```homesize.sh
#!/bin/bash
du -h ~ | tail -n 1
```

からの


```
$chmod +x homesize.sh

$ ./homesize.sh
```

これでシェルスクリプトを実行することができる

1行目のやつはシバンもしくはシェバンと呼ばれ、/bin/bashで以下のコマンドを実行するよーっていう意味。

また、1行目を書かずに、sourceコマンドや.でファイルの中身を実行することもできる。
シバンをつけるとサブシェルで実行されるので、元のシェルには影響を及ぼさないが、sourceや.コマンドでは元のシェルに影響を及ぼす。


また、複数のコマンドを;で区切ることで1行で書くことができる。

```rootls.sh
#!/bin/bash
echo "root directory";cd /;ls -l
```

コマンドが1行に収まらなそうなら、\を使うことで改行できる。

シェルスクリプトではシェル変数というものを使うことができる。

シェル変数を参照するには$変数名とする。


```example.sh
#!/bin/bash

comment="Ruby on Rails"
echo $comment
```

こんな感じで変数を参照するよ。


変数に続いて文字列をechoしたいなんて時は

```example.sh
#!/bin/bash

comment=Ruby
echo ${comment} on Rails
```

こんな感じで${変数名}とすると良い


また、文字列ないでシェル変数を使うには""で囲まなくてはいけない。Rubyと同じ。

```example.sh
#!/bin/bash

comment=Ruby
echo "$comment on Rails"
```


コマンドの結果をシェルスクリプトで使いたい時は、$()の中にコマンドを書く。その結果を文字列として取得することができる。

```example.sh
#!/bin/bash

comment=$(date '+%Y-%m-%d')
echo "today is $comment"
```

こんな感じ。


こんな書き方もできる

```example.sh
#!/bin/bash

echo "today is $(date '+%Y-%m-%d')"
```

位置パラメーターを使う

```example.sh
#!/bin/bash

echo $1
echo $2
```

上記のファイルがある状態で、

```
$ ./example.sh Ruby PHP
```

とすると、
./example.shが$0
Rubyが$1
PHPが$2
となり、

```
Ruby
PHP
```

と出力される。


引数の個数を取得するには$#と書けば良い。

```example.sh
#!/bin/bash

echo $1
echo $2
echo "vars $#"
```


引数を分割せずに使うには、$@か$*を使う。

```example.sh
#!/bin/bash

echo $@
echo $*
```

この状態で./example.sh hello worldとするとhello worldと出力される。
$@は一つ一つの引数がそれぞれ展開されていく。
$*は複数の引数を1つの引数ととらえる。


if文を使ってみる。

```example.sh
#!/bin/bash

if [ "$1" = "bin" ]; then
  echo "ok"
else
  echo "ng"
fi
```

第一引数がbinという文字列ならokを出力する。


終了ステータスとは、

例えばlsを打って正常に動作した場合は、

```
$echo $?
```

で終了ステータス 0を取得することができる。

エラーになってしまった場合は、0以外の数値を取得する。



[ 条件式 ]はtestコマンドで代用できる。


```example.sh
if test "$1" = "bin"; then
  echo "ok"
else
  echo "ng"
fi
```

こんな感じ。


評価演算子はp292あたりに。


for文の使い方

```
for 変数名 in リスト
do
  繰り返す処理
done
```

詳しくはp300くらい