コマンド入力をラクにする
コマンド名やファイル名はTabキーを打って補完出来る。
bashのショートカットはいろいろありますが、
* Ctrl+A, Ctrl+E (行頭、行末へカーソル移動)
* Ctrl+U, Ctrl+K (行頭まで削除、行末まで削除)
* Ctrl+W (1単語分コマンドを削除)
* Ctrl+L (ターミナルの表示をクリア)
* ↑, ↓, Ctrl+R (コマンド履歴の参照)
* Ctrl+C (実行中のコマンドを中止)
あたりの使用頻度が高いです。
ディレクトリの確認
# pwd: 今いるフォルダの絶対パスを表示
# ls: 現在のフォルダにあるファイルやディレクトリを表示
# ls -al:
# * -a: 隠しファイルも表示(由来: all)
# * -l: 詳細な情報を表示(由来: list?)
# * とにかく全部みたいときに使う
# * 大きいファイルがある場合はls -alhにすると見やすい
# ls -ltr: 新しいファイルが一番下に来るように表示
# * -t: タイムスタンプ順で表示(由来: time)
# * -r: 逆順で表示(由来: reverse)
# * 最新のログファイルを探す目的でよく使う
# * 最新が一番下に来るので、ファイル数が多くても見切れない
# * 逆に、一番古いファイルを見たい場合はls -lt
# tree: ディレクトリ構造を表示
階層移動とファイル操作
# cd path: pathへ移動
# cd: ログインユーザのホームディレクトリに移動
# cd -: 直前にいたディレクトリへ移動
# cd ~/path: ログインユーザのホームディレクトリ以下のpathに移動
# * ~はログインユーザのホームディレクトリに読み替えられる(=チルダ展開)
# * ~xxxだとxxxユーザのホームディレクトリに読み替えられる
# mkdir directory_name: ディレクトリを作成(1階層のみ)
$ mkdir aaa/bbb/ccc # 深い階層を一気に作るには-pオプションが必要
# touch file_name: ファイルを新規作成 or タイムスタイプを現在時刻に更新
# * 本来はファイルのタイムスタンプを更新するコマンドなんだけど、
# 指定したファイルが存在しない場合は新規作成するため、専らファイル作成コマンドと化している印象
# mv source/path destination/path: ファイルやディレクトリの移動
# mv filename_before filename_after: リネーム
# * OS管理上リネームとファイル移動は大体同じ
# * 確認がうるさいときは-fオプションをつける(f: force / 誤操作注意!)
# cp -r source/path destination/path: ファイルやディレクトリのコピー
# * -r: ディレクトリ以下を再帰的にコピー(由来: recursive)
# * -f: 確認無しで強制コピー(由来: force) <- 誤操作注意!
# * -p: コピー前後でパーミッションを保持(由来: permission)
# rm -f file_name: ファイルを削除
# rm -rf directory_name: ディレクトリを削除
# * -f: 確認無しで強制コピー(由来: force)
# * -r: ディレクトリ以下を再帰的に削除(由来: recursive)
# * -i: ファイルの削除前に確認する
# * Windowsと違って消したら戻せないので、よくよく気を付けよう
# * うっかり「rm -rf /」を実行するとOSを含めシステムが全削除されます
# 慌ててCtrl+Cで止めたが、基本的なコマンドの実行ファイルが削除されていてまともに作業できない!
# ...みたいなことになります。(昔、隣の席の人がやらかしてた)
# * シェルスクリプトで rm -rf /${DIR_PATH} と書いたが${DIR_PATH}が空文字で
# 「rm -rf /」となるのはありがちかも。
# (こういう事故が起きないよう、シェルスクリプトではset -uをつけるのがベター
# tar -czvf xxx.tgz file1 file2 dir1 : 圧縮(file1 file2 dir1をアーカイブした圧縮ファイルxxx.tgzを作成)
# tar -tzvf xxx.tgz: 圧縮ファイルに含まれるファイル名を表示(=展開のテスト)
# tar -xzvf xxx.tgz: 展開
# * tarのオプションはハイパーややこしい
# ...んだけど、普通に作業する分には上の3つで事足りると思う
# * c(create), t(test), x(extract) + zvfと覚える
# * なおアーカイブと圧縮は別の事象。
# 複数ファイルを一つにまとめるのがアーカイブ。ファイル容量を削減するのが圧縮。
テキスト処理(フィルタコマンド)
* bashにはパイプ(|)と呼ばれる構文がある
* コマンドA | コマンドB | コマンドCと書いたら、次の動きとなる
コマンドAは処理結果(文字列A)を標準出力に出す
コマンドBは標準入力から文字列Aを受け取り、処理結果(文字列B)を標準出力に出す
コマンドCは標準入力から文字列Bを受け取り、処理結果(文字列C)を標準出力に出す
* コマンドA、B、Cのような、標準入力から文字列をinputして標準出力へ文字列をoutputするコマンドを「フィルタコマンド」という
* フィルタコマンドを使って文字列を加工することを「テキスト処理」という
* また、パイプ等を駆使してコマンド1行でいろんな処理をすることを俗に「ワンライナー」という
# cat file1: file1の内容を標準出力に出力
# cat file1 file2: file1の内容を標準出力に出力 → file2の内容を標準出力に出力
# wc -l file1: file1の行数を数える(行数 + ファイル名が出る)
# cat file1 | wc -l: file1の行数を数える(行数だけ出る)
# * -l: 行数を数える(由来: line)
# * -w: 単語数を数える(由来: word)
# * -c: バイト数を数える(由来: char? )
# head -n 3 file1: file1の先頭3行を出力
# * 言うほど使わないけど、次に紹介するtailと対になるコマンドなので紹介
# * 用途1: 重たいファイルの頭の方だけ確認
# * 用途2: ファイルのヘッダ行だけ取得してプログラムから使う
# tail -n 3 file1: file1の末尾3行を出力
# * 用途1: 重たいログファイルの最後の方だけ見る
# tail -f error.log: error.logを監視して、更新された内容を出力(由来: feed?)
# sort file1: file1を行単位でソート
# uniq file1: file1の重複業を削除
# cat file1 | sort | uniq: file1をソートして、重複業を排除
# grep ERROR *.log: 拡張子がlogのファイルから、ERRORを含む行だけ抽出
# cat error.log | grep ERROR: error.logからERRORを含む行だけ抽出
# cat error.log | grep -2 ERROR: error.logからERRORを含む行とその前後2行を出力
# cat error.log | grep -e ERROR -e WARN: error.logからERRORまたはWARNを含む行を抽出
# cat error.log | grep ERROR | grep -v 400: error.logからERRORを含む行を抽出して、400を含む行を排除した結果を表示
# * -e: 複数キーワードをAND条件で指定(由来: ?? たぶん違うけど、個人的にはフランス語のet(=and)だと解釈してる)
# * -v: キーワードを含む行を排除(由来: verbose??)
# * テキスト絞り込み、という高需要な用途ゆえワンライナーの中終盤で大活躍
# * 正規表現も使えます
# cat file1 | sed 's/BEFORE/AFTER/g': file1中のBEFOREをAFTERに一括置換
# * s/BEFORE/AFTER/g: BEFOREをAFTERに置換(由来: substituteとglobal?)
# * s/BEFORE/AFTER/: 1番目に出現したBEFOREをAFTERに置換
# * viでも:%s/BEFORE/AFTER/gで一括置換できるので覚えとくと便利
# (使用例: git rebase -i HEAD~5 -> viが開く -> :%s/pick/s/g で直近5コミットをまとめる)
# * 一括置換だけじゃなく削除や部分置換もできるし、正規表現も使えます
# * 元のファイルは変わりません(-iオプションを付けて上書きすることも可能)
# cmd1 | awk '{print $5}': cmd1実行結果から、スペース区切りで5列目だけ表示
# cmd1 | awk -F ',' '{print $5}': cmd1実行結果から、カンマ区切りで5列目だけ表示
# * ワンライナーの王様(私見)
# * ifもforも変数も使えるし、区分としてはコマンドというよりプログラミング言語
# * 〇〇区切りのn列目を抽出したい、みたいな要件だとドンピシャな言語
# * なお、awkの文脈だと"n列目"じゃなくて"nフィールド目"と呼ぶ
# cmd1 | xargs cmd2: cmd1の実行結果をコマンドライン引数として受け取って、cmd2を実行
# * cmd1 | cmd2は、cmd1の実行結果を「標準入力」として受け取ってcmd2を実行するのに対し
# cmd1 | xargs cmd2は、cmd1の実行結果を「コマンドライン引数」として受け取ってcmd2を実行する
# less file1: file1を見る(read only)
# cat file1 | cmd1 | cmd2 | less: file1をいろいろ加工した結果を見る
# * ターミナルに出力せず、何かを見たいときにとりあえず使うコマンド
# * 類似コマンドmoreの上位互換 (less is more!)
# * read onlyなので安全安心 (変える気がないのにviで見るのはやめよう)
# * viの一部キーバインドが使える
# gg: 先頭行へ移動
# G: 最終行へ移動
# /pattern: patternでファイル内検索
# q: 閉じる
# cmd1 >> file1: cmd1の実行結果をfile1に書き出す(追記)
# cmd1 > file1: cmd1の実行結果をfile1に書き出す(上書き)
インストールまわり
# apt install git: gitをインストール(Ubuntuなど、Debian系OS)
# yum install git: gitをインストール(CentOSなど、RedHat系OS)
# * しばしばsudo apt~形式で実行する
# * 実行して「Permission Denied」「権限が足りません」系のメッセージがでたらとりあえずsudoする(雑)
# (あるいはchown, chmodで権限を適切に設定する)
# sudo cmd1: cmd1をrootユーザとして実行
# su user1: user1に切り替える(環境変数は現在のものを引き継ぐ)
# su - user1: user1に切り替える(現在の環境変数を捨てて、user1デフォルトの環境変数を利用)
# su -: rootユーザーに切り替える(現在の環境変数を捨てて、rootユーザーデフォルトの環境変数を利用)
# * 私は常にハイフンを付けます
# echo abc: 文字列abcを出力
# echo $PATH: 環境変数PATHを出力
# env | less: 環境変数を確認
# * envだけでも見れるが、環境変数が多い場合見切れてしまうためlessで確認
# which cmd: cmdの実体が置かれている場所を表示
# whereis cmd: whichのちょっと詳しい版
# source ~/.bashrc: .bashrcを再読み込み
# . ~/.bashrc: ↑と同じ(.はsourceのエイリアス)
# * シェルの設定ファイルを変更した後の再読み込みで使うケースが100%(自分調べ)
# chmod 755 *.sh: shファイルに実行権限を付与
# chmod 644 *.js: jsファイルを普通に読み書きできる設定にする
# * wとかrとか文字でも設定できるけど、私は数字派
# * プログラムを実行して「Permission denied」と出たときは大抵実行権限がないだけなので、755へ変更すればOK
# * 755のように数字を3つ並べるのは次の3つを指定している
# [所有者に対する権限][所有グループに対する権限][その他に対する権限]
# * 数字の意味は次の通り
# 0: 権限なし
# 1: 実行権限
# 2: 書き込み権限
# 4: 読み込み権限
# (7=1+2+4で全部OK, 6=2+4で読み書きのみ、といった具合)
# * つまり755は、"所有者はなんでもできる、他の人は読み書きだけできる"という設定
# 644は、"所有者は読み書きできる、他の人は読むことだけできる"という設定
# chown user1:group1 file1: file1の所有者を変更(ユーザーをuser1, グループをgroup1にする)
# find dir1 | xargs chown user1:group1: dir1以下の全ファイルの所有者を一括変更
# * ユーザ一覧の確認はcat /etc/passwd
OSまわり
# date: 現在時を表示
# date '+%Y%m%d %H:%M:%S': YYYYMMDD hh:mm:ss形式で現在時を表示
# date -s "YYYYMMDD hh:mm:ss": OS時刻を変更(由来: set)
# df -h: ディスクの使用量/空き容量を単位付きで表示(由来: human readable)
# df: ディスクの使用量/空き容量を表示
# du -h: 各ディレクトリの容量を単位付きで表示(由来: human readable)
# du: 各ディレクトリの容量を表示
# free -h: メモリ使用状況を単位付きで表示(由来: human readable)
# free: メモリ使用状況を表示
# top: CPUやメモリの使用状況を確認
# * デフォルトだとCPU使用率の多いプロセスが上に来る
# * %CPUがCPU使用率。どのプロセスが高負荷かを確認できる。
# ps -ef: 全てのプロセスの詳細な情報を見る(由来: every, full)
# kill 123: プロセスIDが123のプロセスを停止させる(SIGTERMを送る)
# kill -9 123: プロセスIDが123のプロセスを問答無用で殺す(9はSIGKILLのシグナル番号)
# pkill process_name_prefix: process_name_prefixで始まるプロセスすべてを終了させる
# pkill -9 process_name_prefix: process_name_prefixで始まるプロセスすべてを問答無用で終了させる
# pgrep process_name_prefix: process_name_prefixで始まるプロセスすべてのPIDを出力
# netstat -anp| less: ネットワークの状態を確認
# * -a: すべての接続を表示(由来: all)
# * -n: 名前解決しないで素のIPアドレス、ポート番号を表示(由来: number?)
# * -p: プロセスIDを表示(由来: process)
その他
# find dir1 -type f: dir1以下のファイル一覧を表示
# find dir1 -type f -name "*.js": dir1以下のjsファイルの一覧を表示
# find dir1 -type d: dir1以下のディレクトリ一覧を表示
# history | less: コマンド履歴を確認
# diff file1 file2: file1とfile2の差分を表示
# diff -r dir1 dir2: dir1とdir2の差分を表示(サブディレクトリもチェック)
# jobs: バックグラウンド実行中のジョブ一覧を表示
# fg 1: ジョブ1をフォアグラウンド実行に切り替える
# bg 1: ジョブ1をバックグラウンド実行に切り替える
# cmd1: cmd1をフォアグラウンドで実行
# cmd1 &: cmd1をバックグラウンドで実行
# cmd1 && cmd2: cmd1が成功したら、cmd2を実行(cmd1が失敗したらそこで終わり)
# cmd1 || cmd2: cmd1が失敗したら、cmd2を実行(cmd1が成功したらそこで終わり)
echo ${var1}: 変数var1の中身を出力 (変数展開)
# echo $(cmd1): cmd1の実行結果を出力 (コマンド置換)
# echo `cmd1`: ↑とだいたい同じ (コマンド置換(旧記法))
# diff <(cmd1) <(cmd2): cmd1とcmd2の実行結果を出力 (プロセス置換)
# echo $?: 直前のコマンドの終了ステータスを表示
# for i in {1..10} ; do cmd1; done: cmd1を10回繰り返す
aptコマンド
apt-getとaptの違い
* aptは新しいパッケージ管理コマンドで apt-getとapt-cacheが統合したもの
* aptはプログレスバーがついて進捗がわかりやすい
* upgradeのときaptよりapt-getの方が条件が厳しい(慎重)
# パッケージのリストをアップデートして、インストールする
$ sudo apt update
$ sudo apt install <package>
$ sudo apt -y install <package> or $ sudo apt install <package> -y # Yes/Noを聞かない
# ログを極力表示させたくない
$ sudo apt -qq update
$ sudo apt -qq install <package>
# ログを全く表示させたくない
$ sudo apt update > /dev/null 2>&1
$ sudo apt install <package> > /dev/null 2>&1
インストール可能なパッケージのバージョンの一覧の確認
$ apt list -a <package>
0 コメント:
コメントを投稿