base64
入力をBASE64
でエンコード(デコード)して出力
# ex. test.txt を BASE64 でエンコードし、test_base64.txt へ出力
$ base64 test.txt > test_base64.txt
# デコード時のオプション
base64 -d 【ファイル名】
base64 --decode 【ファイル名】
# ex. BASE64 でエンコードされた test_base64.txt をデコード
$ base64 -d test_base64.txt
これは test_base64.txt をデコードしたファイルの内容です
basename
ファイルパスからディレクトリ部分を取り除く
basename 【ファイル名】
# ex. /home/user/test.txt からファイル名のみ表示
$ basename /home/user/test.txt
test.txt
ファイル名から拡張子を取り除く
basename 【ファイル名】【拡張子】
# ex. test.txt から .txt を取り除く
$ basename test.txt .txt
test
# ex. ファイルパスから拡張子を取り除いたファイル名のみ表示
$ basename /home/user/test.txt .txt
test
bc
小数点以下のケタ数を指定して計算する
# echo コマンドと組み合わせて実行する
echo "scale = 【小数点以下のケタ数】; 【計算式】" | bc
# ex. 5 ÷ 3 の計算結果を小数点以下2ケタまで表示
$ echo "scale = 2; 5 / 3" | bc
1.66
cat
ファイルの内容を表示
cat 【ファイル名】
# ファイルを連結して表示
cat 【ファイル1】 【ファイル2】
# ex. file1.txt と file2.txt の内容をまとめて、file3.txt へ出力
$ cat file1.txt file2.txt > file3.txt
$ cat file3.txt
file1.txt の内容です
file2.txt の内容です
# 行番号を表示
cat -n 【ファイル名】
cat --number 【ファイル名】
# ex. test.txt の内容を行番号を付けて表示
$ cat -n test.txt
1 test.txt ファイルの1行目です
2 test.txt ファイルの2行目です
3 test.txt ファイルの3行目です
chmod (change mode)
ファイルやディレクトリのアクセス権限を変更
r | w | x |
---|---|---|
読み込み可能 | 書き込み可能 | 実行可能 |
# 1) 所有ユーザ, 2) 所有グループ, 3) その他ユーザ, それぞれのアクセス権限
-rwxrwxrwx
1 2 3
モードビット
r-- | -w- | --x | --- |
---|---|---|---|
4 | 2 | 1 | 0 |
読み込み可能 | 書き込み可能 | 実行可能 | 権限なし |
上記の足し算によって権限を組み合わせる
-wx | r-x | rw- | rwx |
---|---|---|---|
2 + 1 = 3 | 4 + 1 = 5 | 4 + 2 = 6 | 4 + 2 + 1 = 7 |
書き込み・実行 | 読み込み・実行 | 読み込み・書き込み | 読み込み・書き込み・実行 |
chmod 【アクセス権限】 【ファイル名】
# ex. test.sh に対して、全ユーザに全アクセス権限を設定
$ chmod 777 test.sh
-rwxrwxrwx test.sh
# ex. test.sh に対して、所有ユーザに全アクセス権限、所有グループとその他ユーザに読み込み&実行権限を設定
$ chmod 755 test.sh
-rwxr-xr-x test.sh
# ex. test.sh に対して、所有ユーザに読み込み&書き込み権限を設定(所有グループとその他ユーザは権限なし)
$ chmod 600 test.sh
-rw------- test.sh
chown (change owner)
ファイル所有権やグループ所有権を変更
# ディレクトリ以下も再帰的に所有権を変更
chown -R 【ユーザ】:【グループ名】 【ディレクトリ】
# ex. /home/test 以下の所有権を user へ変更
chown -R user /home/test/
-rwxr-xr-x 1 user user 0 Feb 2 22:01 test
ユーザ名とグループ名の指定方法
指定方法 | 詳細 |
---|---|
ユーザ名:グループ名 | 指定したユーザ名とグループ名を設定 |
ユーザ名 | 対象ファイルの所有ユーザ名のみ変更 |
ユーザ名: | ユーザ名と、ユーザ名と同じグループ名を設定 |
:グループ名 | 対象ファイルの所有グループ名のみ変更 |
clear
画面をクリアにする
clear
キーボードショートカット Ctrl
+ l
でも同様の結果を得られる。
cp
ファイルやディレクトリをコピー
cp 【コピー元ファイル】 【コピー先ファイル】
# カレントディレクトリの file1.txt を file2.txt というファイル名でコピー
cp file1.txt file2.txt
コピー元にディレクトリを指定した場合、再帰的に(サブディレクトリも含めて)コピーする
cp -r 【コピー元ファイル/ディレクトリ】 【コピー先ディレクトリ】
cp --recursive 【コピー元ファイル/ディレクトリ】 【コピー先ディレクトリ】
# ex. folder 配下すべてを folder_copied へディレクトリ構造を含めてコピー
cp -r folder folder_copied
【コピー元ファイル】 を 【コピー先ディレクトリ】 へコピーする
cp 【コピー元ファイル】 -t 【コピー先ディレクトリ】
cp 【コピー元ファイル】 --target-directory= 【コピー先ディレクトリ】
# ex. file.txt をディレクトリ folder_copied へコピー
cp file.txt -t folder_copied
# recursive オプションでコピー元をファイルにした場合と同じ結果になる
cp -r file.txt folder_copied
【コピー元ファイル】 を 【コピー先ディレクトリ】 へディレクトリ構造ごとコピー
cp --parents 【コピー元ファイル】 【コピー先ディレクトリ】
# ex. folder/file.txt をディレクトリ folder_copied/folder へコピー
cp --parents folder/file.txt folder_copied
# recursive オプションでは、コピー元をファイルにした場合、ディレクトリ構造はコピーされない
$ cp -r folder/file.txt folder_copied
$ find ./folder_copied -name 'file.txt'
./folder_copied/file.txt
# parents オプションでは、コピー元をファイルにしてもディレクトリ構造ごとコピーされる
$ cp --parents folder/file.txt folder_copied
$ find ./folder_copied -name 'file.txt'
./folder_copied/folder/file.txt
特定ディレクトリ配下の「特定ファイルのみ」ディレクトリ構造を含めてコピーしたい場合は find, xargs コマンドと組み合わせる
# ex. folder 配下の log ファイルのみ folder_copied へディレクトリ構造を含めてコピー
find ./folder -type f -name '*.log' | xargs cp --parents --target-directory=folder_copied
cut
ファイルの各行から指定した範囲を切り出す
# 【区切り文字】 で区切られたcsvなどの 【ファイル名】 から 【項目数】 の範囲を表示
cut -d 【区切り文字】 -f 【項目数】 【ファイル名】
cut --delimiter= 【区切り文字】 --fields= 【項目数】 【ファイル名】
# ex. test.csv の2列目を表示
$ cut -d "," -f 2 test.csv
test.csv の2列目ヘッダです
test.csv の2列目2行目です
test.csv の2列目3行目です
# 指定した 【文字数】 だけ表示
cut -c 【文字数】
cut --characters= 【文字数】
# ex. test.csv の2列目の14文字目を表示
$ cut -d "," -f 2 test.csv | cut -c 14
ヘ
2
3
# ex. test.csv の2列目の14文字目までを表示
$ cut -d "," -f 2 test.csv | cut -c 1-14
test.csv の2列目ヘ
test.csv の2列目2
test.csv の2列目3
date
日付と時刻の表示
# 現在のローカル日時を表示
$ date
Thu Feb 20 20:05:55 JST 2020
# 現在のローカル日時を yyyy/mm/dd hh:mm:ss 形式で表示
$ date '+%Y/%m/%d %H:%M:%S'
2020/02/20 20:05:55
# 現在ではなく 【日時】 で指定した日時を表示
date -d 【日時】
date --date= 【日時】
# ex. 10日前のローカル日時を表示
$ date -d '10 days ago'
Mon Feb 10 20:05:55 JST 2020
unixtime への変換については unixtime 相互変換 を参照。
echo
任意の1行テキストを表示
# 画面に Hello World と表示する
$ echo 'Hello World'
Hello World
# エスケープ文字を解釈する
$ echo -e '【エスケープ文字を含んだ任意の1行テキスト】'
# ex. 画面に Hello World を改行して表示する
$ echo -e 'Hello\nWorld'
Hello
World
# 出力した任意の1行テキストの最後を改行しない
$ echo -n '【エスケープ文字を含んだ任意の1行テキスト】'
expr
計算式や論理式を評価する
expr 【評価式】
四則演算
# 3 ÷ 2 の結果を返す(小数は切り捨てられる)
$ expr 3 + 2
1
# 3 ÷ 2 の余りを返す
$ expr 3 % 2
1
比較
# x=100 と y=200 は等しくないので、= による比較の場合 0 (=FALSE) を返す
$ x=100; y=200
$ expr ${x} = ${y}
0
# x=100 と y=200 は等しくないので、!= による比較の場合 1 (=TRUE) を返す
$ x=100; y=200
$ expr ${x} != ${y}
1
find
ディレクトリツリーからファイルを検索
find 【検索開始ディレクトリ】 【検索条件】 【アクション】
# ex. カレントディレクトリ(.)を起点に file.txt を検索し(-name 'file.txt')、そのパスを表示(-print)
$ find . -name 'file.txt' -print
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder2/file.txt
./folder/subfolder2/subsubfolder/file.txt
# パス名を表示するアクション -print は find コマンド【アクション】のデフォルトであるため省略可能
$ find . -name 'file.txt'
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder2/file.txt
./folder/subfolder2/subsubfolder/file.txt
【検索条件】 ファイル名で探す
# -name はファイル名の大小文字を区別し、-iname は区別しない
find 【検索開始ディレクトリ】 -name 【ファイル名】 【アクション】
find 【検索開始ディレクトリ】 -iname 【ファイル名】 【アクション】
# ex. カレントディレクトリを起点に subfile*.log を検索し、そのパスを表示
$ find . -name 'subfile*.log' -print
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
$ find . -iname 'SUBFILE*.LOG' -print
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
【検索条件】 ファイルの種類で探す
# -type d はディレクトリを、-type f は通常ファイルを検索
find 【検索開始ディレクトリ】 -type d 【アクション】
find 【検索開始ディレクトリ】 -type f 【アクション】
# ex. カレントディレクトリ以下のディレクトリを列挙
$ find . -type d -print
./folder
./folder/subfolder1
./folder/subfolder2
./folder/subfolder2/subsubfolder
# ex. カレントディレクトリ以下のファイルを列挙
$ find . -type f -print
./folder/file.log
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder1/subfile1.log
./folder/subfolder2/file.txt
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/file.txt
./folder/subfolder2/subsubfolder/subsubfile.log
【検索条件】 複数の条件を指定
find 【検索開始ディレクトリ】 【検索条件1】 -a 【検索条件2】 【アクション】
# ex. folder 配下の log ファイルのみ検索
$ find ./folder/ -type f -a -name '*.log' -print
./folder/file.log
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/subsubfile.log
# -a は省略可能
$ find ./folder/ -type f -name '*.log' -print
./folder/file.log
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/subsubfile.log
head
ファイルの先頭から指定の行数だけを取り出す
head -n 【行数】 【ファイル名】
head --lines= 【行数】 【ファイル名】
# デフォルトは10行を表示
$ head test.txt
test.txt ファイルの1行目です
test.txt ファイルの2行目です
test.txt ファイルの3行目です
test.txt ファイルの4行目です
test.txt ファイルの5行目です
test.txt ファイルの6行目です
test.txt ファイルの7行目です
test.txt ファイルの8行目です
test.txt ファイルの9行目です
test.txt ファイルの10行目です
# ex. test.txt の先頭行を表示
$ head -n 1 test.txt
test.txt ファイルの先頭行です
less
ファイルの内容をスクロール表示(行数の多いファイルを1画面ごとに上下にスクロール表示)
less 【ファイル名】
# 行番号を表示
less -N 【ファイル名】
less --LINE-NUMBERS 【ファイル名】
less
コマンドモード操作
コマンド | 内容 |
---|---|
スペースキー | 1画面下にスクロール |
Enter キー | 1行下にスクロール |
q | コマンドモードの終了 |
/【文字列】 | 下方向に向かって 【文字列】 を検索 |
mkdir
ディレクトリを作成する
mkdir 【作成するディレクトリ名】
# 深いディレクトリを一気に作成する
mkdir -p 【作成するディレクトリ名】
mkdir --parents 【作成するディレクトリ名】
# directory を作成し、その配下に sub-directory、さらに配下に sub-sub-directory を作成する
$ mkdir -p directory/sub-directory/sub-sub-directory
mysql
MySQLサーバへ接続しデータベースを利用する
$ mysql -h 【ホスト名】 -P 【ポート番号】 -u 【ユーザ名】 -p
Enter password:
MySQL>
# 終了する
MySQL> exit / quit
rm
ファイルやディレクトリを削除
# 強制的に削除
rm -f 【ディレクトリ or ファイル名】
rm --force 【ディレクトリ or ファイル名】
# ディレクトリ配下にサブディレクトリやファイルが存在しても削除
rm -r 【ディレクトリ名】
# ex. directory ディレクトリ内にサブディレクトリやファイルが残っていても強制的に削除
$ rm -rf directory
sleep
一定時間、待機する
sleep 【秒数】
$ time sleep 15
real 0m15.003s
while文 などと合わせて一定時間ごとにコマンドを実行する。
例)AWS CLI で認証情報レポートの生成・取得・CSV出力をまとめて実行
ssh
SSHでログインする
# 公開鍵認証でログインする
ssh -i 【秘密鍵】 【ユーザ名】 @ 【ホスト名】
tail
ファイルの末尾を表示
# 表示する行数を指定(デフォルトは10)
tail -n 【行数】
# ex. test.txt の最終行を表示
$ tail -n 1 test.txt
test.txt の最終行です
test
条件の判断
# ex. ディレクトリが存在すれば真
if test -d /home/user; then echo 'ホームディレクトリ以下に user というディレクトリがあります'
fi
# ex. ファイルが存在し、かつ通常ファイルならば真
if test -f /home/test.txt; then echo 'ホームディレクトリに test.txt ファイルがあります'
fi
多くの場合 ShellScript の if 直後に [ ] 記号で使用される。
time
コマンド実行時間・リソース利用時間を表示
time 【コマンド】
# ex. sleepコマンドを15秒実行
$ time sleep 15
real 0m15.003s
tr
文字の削除
# 【文字】 で指定した文字を削除
tr -d 【文字】
# ex. test.txt 内のダブルクォートを削除
$ cat test.txt
"000000000000000"
"XXXXXXXXXXXXXXX"
$ tr -d '"' < test.txt
000000000000000
XXXXXXXXXXXXXXX
wc
ファイルの行数を表示
# 改行数を表示
wc -l
# ex. test.txt の改行数を表示
$ cat test.txt | wc -l
12
wget
URLを指定してファイルをダウンロード
wget 【URL】
# ex. http://download/ から file.zip をダウンロード
$ wget http://download/file.zip
which
コマンドのフルパスを表示
# 該当するディレクトリが複数ある場合はすべて表示(エイリアスも表示)
which -a 【コマンド】
which --all 【コマンド】
# ex. コマンド which のフルパスを表示
$ which -a which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/alias
/usr/bin/which
/usr/bin/which
xargs
標準入力からコマンドラインを組み立てて実行
# 標準入力から受け取ったリストを引数として 【実行したいコマンド】 が実行される
xargs 【実行したいコマンド】
【引数リスト】⇒【標準入力】⇒ xargs【実行したいコマンド】
例えば、引数リストが file1.txt
, file2.txt
の場合、下記のような動作になる
file1.txt, file2.txt ⇒【標準入力】⇒【実行したいコマンド】file1.txt, file2.txt
多くの場合、find コマンドと組み合わせて利用する
# folder 配下の file*.txt ファイルを検索し、folder_copied へコピー
$ find ./folder/ -type f -name "file*.txt" | xargs cp --target-directory=folder_copied
$ ls folder_copied
file1.txt file2.txt
パイプ |
だけの場合と違い、xargs
コマンドは前のコマンド実行結果を引数へ変換し、次のコマンドへ渡す
# パイプだけの場合、find(前のコマンド)の結果を、そのまま cat(次のコマンド)へ渡しているだけ
$ find ./folder/ -type f -name "file*.txt" | cat
./folder/file1.txt
./folder/subfolder1/file2.txt
# xargs を使うことで、find(前のコマンド)の結果が、cat(次のコマンド)の引数になっている
$ find ./folder/ -type f -name "file*.txt" | xargs cat
file1.txt の内容です
file2.txt の内容です
$ cat ./folder/file1.txt ./folder/subfolder1/file2.txt
file1.txt の内容です
file2.txt の内容です
【参考】
https://moffu-mofu.hatenadiary.jp/entry/2018/07/29/225300