Linux
- Linux
- 圧縮解凍(tar, gunzip)
- zipコマンド
- 別名の設定(aliasコマンド)
- BOMの扱い
- フォルダのサイズを確認する(duコマンド)
- フォルダの空き容量を表示する(dfコマンド)
- 文字列を編集する(sedコマンド)
- csvを改行区切りに変換する
- 列単位で編集する(awk)
- scpコマンド
- ファイル名にDateを使う
- dateコマンドでタイムゾーンを変更する
- 日付計算を行う
- freeコマンド
- シンボリックリンク(lnコマンド)
- grep
- バイナリファイルかどうか確認する(fileコマンド)
- 文字コードを変換する(iconv)
- xargs
- サービスの登録(systemd)(Ubuntu)
- CPU,メモリの監視をログに出力する(vmstat, tee)
- 標準出力/エラー出力を捨てる
- ログローテート
- ダミーファイルを作成する(ddコマンド)
- cat json - jq - lessを色付きにする
- 改行コード確認
- 改行コード変換
- tab -> スペース変換(expand)
- diff
- ファイルの行数を取得する(wc)
- tsvのn列目の値を取得する
- n行ごとに区切る
- 重複排除
- MD5ハッシュ値取得
- 前後のスペースを除去する(trim)
- sshポートフォワーディング
- GUIとCUIを切り替える
- リモートデスクトップサービス
- 起動時に何らかのサービスを起動する
- ストレージのチェックと修復
- バイナリ単位で比較する(cmp)
- 公開鍵作成
- 公開鍵削除
- known_hosts(ssh鍵用のファイル)を編集する
- クリップボードに貼り付ける
- chmod
- ユーザが所属しているグループを確認する(groups)
- グループIDと所属しているユーザを確認する
- tmpの自動削除
- 設定ファイルの読み込み順
- パスワードを保存する(.netrc)
- パスワードを生成する(pwgen)
- 相対パス -> 絶対パス(フルパス)変換
- Shift-JISのファイルに対してgrepする
- プロンプトを設定する
- 大文字 -> 小文字
圧縮解凍(tar, gunzip)
解凍
tar.gz解凍
tar zxvf ${対象ファイル}.tar.gz
tar解凍
tar xvf ${対象ファイル}.tar
gz解凍
gunzip -k ${対象ファイル}.gz
または
gzip -d ${対象ファイル}.gz
圧縮
tar.gz圧縮
tar zcvf ${対象ファイル}.tar.gz ${対象ディレクトリ}
tar圧縮
tar cvf ${対象ファイル}.tar ${対象ディレクトリ}
gz圧縮
gzip -r ${対象ディレクトリ}
zipコマンド
圧縮
zip -r ${filename}.zip ${dirpath}
別名の設定(aliasコマンド)
${HOME}/.bashrc
にでも書いておくといいんでね?
alias 別名=元のコマンド
# スペースを含む場合はダブルクォーテーションで囲む。
BOMの扱い
有無の確認
file ${filepath}
除去
vi -c 'set nobomb' -c 'wq!' ${filepath}
付与
vi -c 'set bomb' -c 'wq!' ${filepath}
参考
フォルダのサイズを確認する(duコマンド)
du -ms <パス> | sort -nr
- -m
- MB単位表示
- -s
- 総計を表示
フォルダの空き容量を表示する(dfコマンド)
df -hT /dev/xvda1
文字列を編集する(sedコマンド)
先頭に追記する
sed -i '1i${記載したい文字列}' ${ファイルパス}
# まとめて書く
sed -i '1i${記載したい文字列}' *.sql
指定した個所を別のファイルの内容に置換する
$ cat file1
# この下を何かに置換したい
${basicauth}
$ cat basicauth
hoge
piyo
fuga
# 問題のコマンド
$ sed -e '/${basicauth}/r basicauth' file1 -e '/${basicauth}/d'
# この下を何かに置換したい
hoge
piyo
fuga
元のファイルの文字列を置換する
sed -i 's/${変換前}/${変換後}/g' ${ファイルパス}
csvを改行区切りに変換する
ヘッダを取得する時などに使う。
cat ${filepath} | tr ',' '\n' | sed -e 's/"//g'
列単位で編集する(awk)
#!/bin/bash
input_file="file"
output_file="output.csv"
awk -F' ' '{ print $1 "," toupper($2) "," $3 }' "$input_file" > "$output_file"
- -Fで区切り文字を指定。
- printで出力する。$1, $2, $3 …で項目を選択。
- toupperはawkの関数。
scpコマンド
scp ${local_path} ${user}@${hostname}:${remote_path}
scp 参考
ファイル名にDateを使う
cp -p <ファイル名> <ファイル名>`date "+%Y%m%d_%H%M%S"`.<拡張子>
dateコマンドでタイムゾーンを変更する
$ date -d '2024-01-24 10:00:00 +0000' +'%Y-%m-%d %H:%M:%S'
2024-01-24 19:00:00
日付計算を行う
date --date'${基準日} ${数値} ${単位} ${ago}' +${フォーマット}
- 単位
year
,month
,day
- ago
- 前 ->
ago
- 後 -> 何も指定しない
- 前 ->
- フォーマット
%Y/%m/%d
freeコマンド
メモリの調査を行う
オプション | 効果 |
---|---|
-s <数字>数字> | <数字>秒ごとに表示数字> |
-b, -k, -m | xxxバイト単位で表示 |
-t | 物理メモリ、スワップメモリの合計を表示 |
実行例
$ free -s 5 -mt
total used free shared buff/cache available
Mem: 3933 508 2114 251 1309 2995
Swap: 0 0 0
Total: 3933 508 2114
total used free shared buff/cache available
Mem: 3933 508 2114 251 1309 2995
Swap: 0 0 0
Total: 3933 508 2114
total used free shared buff/cache available
Mem: 3933 508 2114 251 1309 2995
Swap: 0 0 0
Total: 3933 508 2114
参考
シンボリックリンク(lnコマンド)
シンボリックリンクを貼る
ln -s <リンク先パス> <入口>
シンボリックリンクを削除する
unlink <入口>
grep
IPアドレスを抽出する
厳密にはIPではないが…
grep -rE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' .
参考
特定のファイルを除外する
--exclude=<ファイル名>
参考
権限がないエラーを出力させない
grep ${検索条件} 2> /dev/null
ファイル名のみ出力する
grep -ril ${検索条件}
バイナリファイルを無視する
--binary-files=without-match
オプション一覧
オプション | 効果 |
---|---|
binaly | 「一致しました」と表示 |
text | バイナリの中身を表示 |
without-match | 無視する |
参考
バイナリファイルかどうか確認する(fileコマンド)
file --mime <対象ファイル>
文字コードを変換する(iconv)
実行例:Shift-JISからUTF-8に変換する。
iconv --f sjis -t utf8 ${変換対象ファイル}
参考
xargs
パイプで受け取ったファイルパスの出力位置を任意で修正する
find . -type f | xargs -I{} bash -c "iconv --f sjis -t utf8 {} > iconv_utf8_{}
別解
find . -type f | while read file; do
echo $file
done
サービスの登録(systemd)(Ubuntu)
登録方法
- /usr/lib/systemd/system配下に*.serviceのファイル名でファイル作成
- 作成したファイルの中身を記載する。
sudo systemctl enable <サービス>.service
[Install]が書いてあればシンボリックリンクは勝手に貼ってくれるはず。/etc/systemd/system
配下のディレクトリに作成される。
起動/停止/ステータス確認
起動
systemctl start <サービス名>
停止
systemctl stop <サービス名>
ステータス
systemctl status <サービス名>
参考
- YUUKO’s経験値:Ubuntu環境で自分で作ったサービスをシステムに登録する方法
- cles::blog:CentOS 7 で自分でビルドした apache を使うと systemctl start が戻ってこない
- Github:SampleUser0001:Transfer_service_memlog
CPU,メモリの監視をログに出力する(vmstat, tee)
vmstat -tn {出力間隔(秒)} | tee {ログファイル名}
出力例
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st JST
0 1 0 4356844 32664 1148536 0 0 54 1 15 79 0 0 99 0 0 2021-03-04 09:15:13
0 0 0 4358884 32664 1148536 0 0 28 0 66 432 0 0 99 0 0 2021-03-04 09:15:14
0 0 0 4358884 32664 1148536 0 0 0 0 61 407 0 0 100 0 0 2021-03-04 09:15:15
0 0 0 4358884 32664 1148536 0 0 0 0 46 361 0 0 100 0 0 2021-03-04 09:15:16
0 0 0 4358884 32664 1148536 0 0 0 0 47 366 0 0 100 0 0 2021-03-04 09:15:17
0 0 0 4358884 32664 1148536 0 0 0 0 54 386 0 0 100 0 0 2021-03-04 09:15:18
0 0 0 4358884 32672 1148528 0 0 0 32 66 427 0 0 99 1 0 2021-03-04 09:15:19
0 0 0 4358884 32672 1148528 0 0 0 0 56 396 0 0 100 0 0 2021-03-04 09:15:20
0 0 0 4358900 32672 1148584 0 0 0 0 59 392 0 0 100 0 0 2021-03-04 09:15:21
0 0 0 4358900 32672 1148584 0 0 0 0 47 361 0 0 100 0 0 2021-03-04 09:15:22
0 0 0 4358900 32672 1148584 0 0 0 0 67 417 0 0 100 0 0 2021-03-04 09:15:23
0 0 0 4358900 32672 1148584 0 0 0 0 71 439 0 0 100 0 0 2021-03-04 09:15:24
0 0 0 4358900 32680 1148576 0 0 0 12 74 454 0 0 99 1 0 2021-03-04 09:15:25
0 0 0 4358900 32680 1148576 0 0 0 0 63 410 0 0 100 0 0 2021-03-04 09:15:26
0 0 0 4358900 32680 1148576 0 0 0 0 45 351 0 0 100 0 0 2021-03-04 09:15:27
0 0 0 4358900 32680 1148576 0 0 0 0 66 409 0 0 100 0 0 2021-03-04 09:15:28
0 0 0 4358900 32680 1148576 0 0 0 0 74 435 0 0 100 0 0 2021-03-04 09:15:29
0 0 0 4358900 32680 1148576 0 0 0 0 34 242 0 0 100 0 0 2021-03-04 09:15:30
0 0 0 4358900 32688 1148568 0 0 0 12 113 536 0 0 99 1 0 2021-03-04 09:15:31
0 0 0 4358900 32688 1148568 0 0 0 0 47 359 0 0 100 0 0 2021-03-04 09:15:32
0 0 0 4358900 32688 1148568 0 0 0 0 57 385 0 0 100 0 0 2021-03-04 09:15:33
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st JST
2 0 0 4358900 32688 1148568 0 0 0 0 61 400 0 0 100 0 0 2021-03-04 09:15:34
0 0 0 4358900 32688 1148568 0 0 0 0 59 406 0 0 100 0 0 2021-03-04 09:15:35
0 0 0 4358900 32688 1148568 0 0 0 0 53 374 0 0 100 0 0 2021-03-04 09:15:36
0 0 0 4358900 32696 1148560 0 0 0 12 59 392 0 0 100 0 0 2021-03-04 09:15:37
0 0 0 4358900 32696 1148560 0 0 0 0 57 397 0 0 100 0 0 2021-03-04 09:15:38
参考
- プログラミングを学ぶ:【Linux】CPUとメモリの負荷と使用率をタイムスタンプ付きでログに残す
- atmarkit:
【 vmstat 】コマンド——仮想メモリやディスクI/Oの統計情報を表示する
- vmstatのオプションについて
標準出力/エラー出力を捨てる
標準出力
${何らかのコマンド} 1> /dev/null
エラー出力
${何らかのコマンド} 2> /dev/null
参考
- Qiita:bashで標準出力、エラーを捨てるとか、ファイルディスクリプタ
- UNIX/Linuxの部屋 用語集:リダイレクト:用語集 リダイレクト コマンドの出力をファイルや別のコマンドに振り分ける (リダイレクション・パイプ)
ログローテート
ダミーファイルを作成する(ddコマンド)
dd if=/dev/zero of=${ファイルパス} bs=1${ファイルサイズ単位} count=${サイズ}
実行例
dd if=/dev/zero of=15G.dummy bs=1G count=15
参考
cat json - jq - lessを色付きにする
cat ${任意のファイル} | jq '.' -C | less -R
改行コード確認
# バイナリ形式で表示する。
od -c ${対象ファイル}
# 文字コードと改行コードを両方表示する。
nkf --guess ${対象ファイル}
改行コード変換
tr '変換元改行コード' '変換先改行コード' < 変換元ファイルパス > 変換先ファイルパス
nkfを使う
# UTF-8に変換して上書きする
nkf -w --overwrite ${ファイルパス}
# 改行コードをLFに変換して上書きする
nkf -Lu --overwrite ${ファイルパス}
tab -> スペース変換(expand)
expand -t ${スペースの個数} ${ファイルパス}
diff
差分の行数を取得する
diff ${ファイルパス1} ${ファイルパス2} | grep "^>" | wc -l
標準出力の結果の差分を取得する
diff <(...) <(...)
diff <(cat hoge.json | jq '.') <(cat piyo.json | jq '.')
みたいな感じで使う。
文字列を直接diffする
diff <(echo '${str_a}') <(echo '${str_b}')
タブ・スペース・改行の違いを無視する
オプション | 意味 |
---|---|
-E | タブとスペースの違いを無視するが・・・タブはスペース8個に換算される。 |
-b | スペースの個数の違いを無視する。 |
-w | スペースの違いを無視する。 |
-B | 空行を無視する。 |
参考
ファイルの行数を取得する(wc)
cat ${ファイルパス} | wc -l
末尾に改行がない場合
wc -l
は改行の数をカウントするので、末尾に改行がない場合は数が合わない。
# 下記のどちらか
sed -e '$a\' ${filepath} | wc -l
awk 'END {print NR}' $filepath
tsvのn列目の値を取得する
# 何列目がほしいか
n=
cat ${ファイルパス} | cut -f $n
1行目(タイトル行)を読み飛ばす
# 何列目がほしいか
n=
tail -n +2 ${ファイルパス} | cut -f $n
n行ごとに区切る
split
コマンドを使う。prefixで指定したファイル名が生成される。
# ファイルパス
filepath=
# 区切り行数
lines=
# prefix
prefix=splited_
split -l $lines $filepath $prefix
末尾の行だけ出力したい
# ファイルパス
filepath=
# 区切り行数
lines=
# prefix
prefix=splited_
split -l $lines $filepath $prefix && tail -q -n 1 $prefix*
重複排除
cat ${対象ファイル} | sort | uniq
MD5ハッシュ値取得
md5sum ${file_path}
ハッシュ値を使って、ファイルが改ざんされていないことを確認する
# 準備。ハッシュ値と、ファイル名のセットを取得して、ファイルにしておく。
sha1sum ${filename} > checksum.txt
# こんな感じのファイルが作成される。
# cat checksum.txt
# a0b65939670bc2c010f4d5d6a0b3e4e4590fb92b sample.txt
# 実行例。
sha1sum -c checksum.txt
sample.txt: OK
# 失敗例。
sha1sum -c checksum.txt
sha1sum: sample.txt: そのようなファイルやディレクトリはありません
sample.txt: オープンまたは読み込みに失敗しました
sha1sum: 警告: 一覧にある 1 個のファイルが読み込めませんでした
前後のスペースを除去する(trim)
echo "${INPUT}" | sed 's/^ *\| *$//'
cut
の結果に対して使うこともできる。
sqlplus
のspool
結果に対して使う等。
#!/bin/bash
diff <(cut -f 2 hoge.tsv | sed 's/^ *\| *$//') <(cut -f 2 piyo.tsv | sed 's/^ *\| *$//')
sshポートフォワーディング
ssh -2 -N -f -L ${LOCAL_PORT}:${接続先ホスト名}:${接続先ポート番号} ${SSH2_USER}@${SSH2_HOST} -p ${SSH2_PORT}
** 使用終了時にプロセスをkillすること。**
GUIとCUIを切り替える
CUIにする
一時的な変更
systemctl isolate multi-user.target
永続的な変更
systemctl set-default multi-user.target
ログイン
Ctrl + Alt + F1 〜 F5
GUIにする
一時的な変更
systemctl isolate graphical.target
永続的な変更
systemctl set-default graphical.target
リモートデスクトップサービス
インストール
apt update && sudo apt upgrade -y
sudo apt install -y xrdp
起動設定
sudo systemctl enable xrdp
sudo systemctl start xrdp
起動時に何らかのサービスを起動する
Ubuntuでは通常systemctlを使用するらしいが・・・
crontab -e
@reboot /etc/rc.local
touch /etc/rc.local
nano /etc/rc.local
# /etc/rc.localに起動したいサービスを書く
chmod 755 /etc/rc.local
ストレージのチェックと修復
# ストレージの調査
sudo fdisk -l
# 不良セクタのチェック
sudo badblocks -v -s ${調査対象のストレージ} | tee /tmp/badblocks.txt
# 不良セクタのマーキング
e2fsck -l /tmp/badblocks.txt
参考
バイナリ単位で比較する(cmp)
cmp ${file1} ${file2}
公開鍵作成
Github認証や、sftp認証で使用する。
ssh-keygen -t rsa
# 作成するファイルパスを入力
# 基本的には${HOME}/.ssh/配下を指定。
# パスワードを入力
# パスワードを入力
# 拡張子が.pubのファイルが公開鍵。接続先サーバに配置する。配置方法は接続先のサービスに依存。
接続可能なことを確認する
ssh -T git@github.com
sftpサーバの場合
# サーバ側
# ユーザ作成
sudo useradd ${new_user}
sudo passwd ${new_user}
# パスワード入力
# クライアント側
cd ~/.ssh
# 公開鍵作成
ssh-keygen -t rsa
# 公開鍵転送
ssh-copy-id -p ${port} -i ${公開鍵ファイルパス} ${サーバ側user}@${サーバホスト名}
# サーバ側
# ファイルがあることを確認する。
su - ${new_user}
cd ~/.ssh
ls -all
# ※clientuser/.ssh/*.pub ファイルの中身がサーバ側の$HOME/.ssh/authorized_keysに記載されていること。
# ディレクトリ権限は700, authorized_keysは600であること。(クライアント、サーバ両方)
# 接続
sftp ${サーバ側ユーザ}@${サーバホスト}
# 鍵生成時にパスフレーズを設定している場合は、ここで入力する。
.ssh/config
Host ホスト名
HostName ホスト名
User 接続先ユーザ名
IdentityFile 秘密鍵パス
IdentitiesOnly yes
公開鍵削除
ssh-remove-id
というコマンドがあるらしいが、今回は使用しない。
クライアント
# known_hostsから削除する
ssh-keygen -R ${サーバ名}
# ~/.ssh/configから削除。手動。
# 公開鍵、秘密鍵を削除。rmコマンド実行。
サーバ
コマンドは見当たらない。
~/.ssh/authorized_keys
から削除する必要があるが、@revoked
をつけて無効化する。
known_hosts(ssh鍵用のファイル)を編集する
削除
ssh-keygen -R $hostname
ssh-keygen -R $ip_address
ssh-keygen -R $hostname,$ip_address
追加
ssh-keyscan -H $hostname,$ip_address >> ~/.ssh/known_hosts
ssh-keyscan -H $ip_address >> ~/.ssh/known_hosts
ssh-keyscan -H $hostname >> ~/.ssh/known_hosts
参考
クリップボードに貼り付ける
Ubuntu
# xselがインストールされていない可能性がある。
cat ${ファイルパス} | xsel --clipboard --input
chmod
シンボルモード
記号 | 意味 |
---|---|
u | 所有者 |
g | グループ |
o | グループ外 |
a | すべて |
記号 | 意味 |
---|---|
+ | 追加 |
- | 削除 |
記号 | 意味 |
---|---|
r | 読み込み |
w | 書き込み |
x | 実行 |
ユーザが所属しているグループを確認する(groups)
groups ${user_name}
# 現在のユーザの所属グループ
groups $(whoami)
グループIDと所属しているユーザを確認する
less /etc/group
例
docker:x:999:ubuntuuser
- グループ : docker
- 暗号化されたパスワード
- グループID : 999
- 所属ユーザ : ubuntuuser
参考
tmpの自動削除
Ubuntu
# systemd-tmpfiles-clean.timerで削除する。
sudo systemctl cat systemd-tmpfiles-clean.timer
...
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
# 削除対象ディレクトリ
cat /usr/lib/tmpfiles.d/tmp.conf
参考
設定ファイルの読み込み順
/etc/profile
- 下記のいずれか
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
/etc/bashrc
参考
パスワードを保存する(.netrc)
${HOME}/.netrc
ファイルを作成する。
もとはFTPのためのユーザ設定ファイルだが、gitもこのファイルを参照する。
# ファイル作成
touch ${HOME}/.netrc
chmod 600 ${HOME}/.netrc
machine ${ドメイン名}
login ${id}
password ${password}
パスワードを生成する(pwgen)
pwgen -c -n -y -1 12
オプション
オプション | 効果 |
---|---|
-c | 最低1文字の大文字 |
-n | 最低1文字の数字 |
-y | 最低1文字の記号 |
-1 | 1件だけ生成する |
参考
相対パス -> 絶対パス(フルパス)変換
echo ${filepath} | xargs readlink -f
Shift-JISのファイルに対してgrepする
find . -type f -exec bash -c 'nkf -Sw {} | grep -n "${grep_word}" && echo {};' \;
git bashでやる
Shift-JISのファイルに対してgrepする : git bash版
プロンプトを設定する
設定例
$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1 " (%s)" 2>/dev/null) $
ChatGPTによる解説
このプロンプト環境変数 ($PS1
) は、Bash シェルのプロンプトの表示を制御します。具体的には、シェルのコマンドラインに表示される情報を指定します。以下、この構成を詳しく説明します。
$PS1
の詳細
${debian_chroot:+($debian_chroot)}
:- もし
debian_chroot
という環境変数が設定されていれば、その値をカッコ内に表示します。Debian や Ubuntu などの一部の Linux ディストリビューションでは、chroot 環境で作業している場合、この変数が設定されます。
- もし
\[\033[01;32m\]
:- この部分はエスケープシーケンスで、次に表示されるテキストの色やスタイルを指定します。
01;32m
は太字の緑色を意味します。
- この部分はエスケープシーケンスで、次に表示されるテキストの色やスタイルを指定します。
\u@\h
:\u
は現在のユーザー名を表示し、@
の後に続く\h
はホスト名(マシン名)を表示します。これにより、プロンプトに「ユーザー名@ホスト名」が表示されます。
\[\033[00m\]
:- これもエスケープシーケンスで、テキストスタイルをリセット(通常の表示に戻す)します。
:
:- コロン(
:
)が表示されます。
- コロン(
\[\033[01;34m\]\w\[\033[00m\]
:- これもエスケープシーケンスを使用しています。
01;34m
は太字の青色を指定し、\w
は現在の作業ディレクトリ(カレントディレクトリ)を表示します。その後、スタイルをリセットします。
- これもエスケープシーケンスを使用しています。
$(__git_ps1 " (%s)" 2>/dev/null)
:- これはGitリポジトリのステータスを表示します。
__git_ps1
は現在のGitブランチ名やステータスを表示するためのコマンドです。" (%s)"
はブランチ名をカッコ内に表示することを指定しています。2>/dev/null
はエラー出力を無視するため、Gitリポジトリでない場合でもエラーを表示しません。
- これはGitリポジトリのステータスを表示します。
$
:- 最後にプロンプトの終わりとして
$
記号が表示され、コマンドを入力する準備ができたことを示します。
- 最後にプロンプトの終わりとして
まとめ
この PS1
の設定により、Bash シェルのプロンプトには次のような情報が表示されます:
- (もし設定されていれば)
debian_chroot
の内容 - ユーザー名とホスト名(緑色)
- カレントディレクトリ(青色)
- 現在のGitブランチ(Gitリポジトリ内の場合)
- 最後に
$
記号
これにより、シェルを使用する際にユーザーは現在の環境や作業場所を一目で確認できるようになっています。
大文字 -> 小文字
echo ${word} | tr [:upper:] [:lower:]