cloud9_note

cloud9に限らないメモ

View on GitHub

Linux

圧縮解凍(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

フォルダの空き容量を表示する(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"

scpコマンド

scp ${local_path} ${user}@${hostname}:${remote_path}

scp 参考

Qiita: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}' +${フォーマット}

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)

登録方法

  1. /usr/lib/systemd/system配下に*.serviceのファイル名でファイル作成
  2. 作成したファイルの中身を記載する。
  3. sudo systemctl enable <サービス>.service

[Install]が書いてあればシンボリックリンクは勝手に貼ってくれるはず。/etc/systemd/system配下のディレクトリに作成される。

起動/停止/ステータス確認

起動

systemctl start <サービス名>

停止

systemctl stop <サービス名>

ステータス

systemctl status <サービス名>

参考

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

参考

標準出力/エラー出力を捨てる

標準出力

${何らかのコマンド} 1> /dev/null

エラー出力

${何らかのコマンド} 2> /dev/null

参考

ログローテート

logrotate.md

ダミーファイルを作成する(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}

Windows版はこちら

ハッシュ値を使って、ファイルが改ざんされていないことを確認する

# 準備。ハッシュ値と、ファイル名のセットを取得して、ファイルにしておく。
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の結果に対して使うこともできる。
sqlplusspool結果に対して使う等。

#!/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

参考

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

参考

設定ファイルの読み込み順

  1. /etc/profile
  2. 下記のいずれか
    1. ~/.bash_profile
    2. ~/.bash_login
    3. ~/.profile
  3. ~/.bashrc
  4. /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 の詳細

  1. ${debian_chroot:+($debian_chroot)}:
    • もし debian_chroot という環境変数が設定されていれば、その値をカッコ内に表示します。Debian や Ubuntu などの一部の Linux ディストリビューションでは、chroot 環境で作業している場合、この変数が設定されます。
  2. \[\033[01;32m\]:
    • この部分はエスケープシーケンスで、次に表示されるテキストの色やスタイルを指定します。01;32m は太字の緑色を意味します。
  3. \u@\h:
    • \u は現在のユーザー名を表示し、@ の後に続く \h はホスト名(マシン名)を表示します。これにより、プロンプトに「ユーザー名@ホスト名」が表示されます。
  4. \[\033[00m\]:
    • これもエスケープシーケンスで、テキストスタイルをリセット(通常の表示に戻す)します。
  5. : :
    • コロン(: )が表示されます。
  6. \[\033[01;34m\]\w\[\033[00m\]:
    • これもエスケープシーケンスを使用しています。01;34m は太字の青色を指定し、\w は現在の作業ディレクトリ(カレントディレクトリ)を表示します。その後、スタイルをリセットします。
  7. $(__git_ps1 " (%s)" 2>/dev/null):
    • これはGitリポジトリのステータスを表示します。__git_ps1 は現在のGitブランチ名やステータスを表示するためのコマンドです。" (%s)" はブランチ名をカッコ内に表示することを指定しています。2>/dev/null はエラー出力を無視するため、Gitリポジトリでない場合でもエラーを表示しません。
  8. $ :
    • 最後にプロンプトの終わりとして $ 記号が表示され、コマンドを入力する準備ができたことを示します。

まとめ

この PS1 の設定により、Bash シェルのプロンプトには次のような情報が表示されます:

これにより、シェルを使用する際にユーザーは現在の環境や作業場所を一目で確認できるようになっています。

大文字 -> 小文字

echo ${word} | tr [:upper:] [:lower:]