linuxコマンド私的メモ
目次
cmp
2 つのファイルをバイト単位で比較します。
終了ステータスは、 入力ファイルの内容が同じであれば 0、 異なっていれば 1、 何か問題が発生すれば 2 です。
-s
- 異なるファイルに対しては何も表示せず、終了ステータスのみを返します。
1$ cmp -s <(echo -e "a\nb") <(echo -e "a\nb"); echo $? 20 3$ cmp -s <(echo -e "a\nb") <(echo -e "a\nb\n"); echo $? 41
comm
comm [-123] FILE1 [FILE2]
ソート済みの2つのファイルを行ごとに比較します。
他の比較ユーティリティと異なり、 comm の返す終了ステータスは比較結果に依存しません。 通常終了時は 0 を返し、エラー時は 0 以外を返します。
comm は二つの入力ファイルを読み込み、 共通な行および共通でない行をそれぞれ表示します。 一方の FILE が省略されると、その分は標準入力から読み込む。また FILE が `-' だった場合には、そのファイルには標準入力が用いられます。
オプションが与えられない場合、 comm は 3 列からなる出力を生成します。 第 1 列には FILE1 だけにしか含まれない行を、 第 2 列には FILE2 だけにしか含まれない行を、 そして第 3 列には両方のファイルに共通に含まれている行をそれぞれ出力します。 列は
-1
- 第 1 列の出力をしない。
-2
- 第 2 列の出力をしない。
-3
- 第 3 列の出力をしない。
-i
- 大文字と小文字を区別せずに行を比較します。
1$ comm <(echo -e "a\nb\nc\nd") <(echo -e "B\nc")
2 B
3a
4b
5 c
6d
7$ comm -1 -2 -i <(echo -e "a\nb\nc\nd") <(echo -e "B\nc")
8b
9c
cp
-f
- 保存先のファイルが開けない場合は、そのファイルを削除し、パーミッションに関係なく確認を求めずに新しいファイルを作成します。 ( -f オプションは、以前の -n オプションを上書きします)。
コピー前にターゲットファイルのリンクが解除されることはありません。 したがって、既存のアクセス権はすべて保持されます。
cut
cut ユーティリティは、各ファイルから各行の選択された部分を切り出し、標準出力に書き出す。
-b
list- list で示したバイト位置だけを表示します。
-c
list- list で示した文字位置だけを表示します。
-d
delim- -f オプションと併用して使う。フィールドの区切り文字として、TAB ではなく delim を使用します。
-f
list- list で示したフィールドだけを表示します。フィールド区切りのデフォルトは TAB です。
1$ cut -b 2 <(echo "abcde")
2b
3$ echo "こんにちは" | cut -c 2
4ん
5$ echo "a b c d e" | cut -f 2 -d ' '
6b
dd
ファイルの変換とコピーを行う。
任意サイズのファイルを作るときに使用できる。
dd if=[入力ファイル] of=[出力ファイル] bs=[バイトサイズ] count=[入力ブロック数]
任意サイズ(ここでは7MB)のNULLファイルを作成する場合。
1$ dd if=/dev/zero of=null_7MB bs=1M count=7 #入力ファイルにNULLデータファイルを指定
27+0 records in
37+0 records out
47340032 bytes transferred in 0.003711 secs (1977912153 bytes/sec)
5$ ls -l null_7MB
6-rw-r--r-- 1 owner group 7340032 6 17 15:04 null_7MB
任意サイズ(ここでは20Byte)のランダムデータファイルを作成する場合。
1$ dd if=/dev/urandom of=my_random bs=1 count=20 #入力ファイルにランダムデータファイルを指定
220+0 records in
320+0 records out
420 bytes transferred in 0.000341 secs (58651 bytes/sec)
5$ cat my_random | base64
6jSGfm2Ht/fAiMYccDGy3McAPob0=
diff
-r
- 見つかった共通のサブディレクトリに diff を再帰的に適用します。
-s
- 2つのファイルが同じだったときも報告します。
-x
pattern- ベースネームが pattern に一致するファイルやサブディレクトリを比較対象から除外します。 pattern は,fnmatch(3) によるシェル形式のグロビングを使用してマッチングされます。 複数の -x オプションを指定することができます。
1# ディレクトリ xz, yz を再帰的に比較。ただし log, tmp の各ディレクトリは比較対象外。
2diff -rs {x,y}z -x "log" -x "tmp"
du
-a
- ファイル階層内の各ファイルのエントリを表示します。
-b
- バイト単位で表示します。
-k
- ブロック数を 1024 バイト (1 kiB) ブロック単位で表示します。
1# /DB ディレクトリでディスク使用量の多い順にソートして出力する
2# sort の -n: 行先頭の文字列を数値文字列として評価、-r: 逆順で出力
3du -abk /DB | sort -nr
envsubst
envsubst
[OPTION] [SHELL-FORMAT]
シェルフォーマット文字列の環境変数を置換する。
標準入力が標準出力にコピーされ、$VARIABLE または ${VARIABLE} 形式の環境変数への参照が対応する値に置換される。環境変数 VARIABLE が未定義の場合は、空文字に置換される。 SHELL-FORMAT が与えられると、SHELL-FORMAT で参照される環境変数のみが置換され、それ以外の場合は、標準入力で発生するすべての環境変数参照が置換されます。
こちらで詳しく説明されています。
https://qiita.com/ko1nksm/items/2769edf52db7cd7b4b3d
1$ export FOO=BAR
2$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst
3dont substitute but do substitute BAR <--- THISが未定義のため空になる
4$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
5dont substitute $THIS but do substitute BAR <--- 指定した変数のみ置換される
find
ファイル階層をたどる
1# find コマンドで ${RECEIVE_DIR} のファイル名を取得し、 2# ファイル名に日付を付けて ${BKUP_DIR} に移動する 3find ${RECEIVE_DIR}/ -maxdepth 1 -type f -name "*.gz" -exec basename {} ¥; | \ 4xargs —no-run-if-empty -I mv -f ${RECEIVE_DIR}/{} ${BKUP_DIR}/${DATE}_{} 2>&
-maxdepth
levels- 検索開始ポイントから最大で levels で示される階層数のディレクトリまで検索します (levels は負ではない整数です)。 -maxdepth 0 を指定すると、テストやアクションの対象は検索開始ポイントだけになります。
-exec
command [argument ...] ;- command を実行します。 command の返り値が 0 なら true を返します。 オプションの引数は command に渡すことができます。 式はセミコロン(";")で終了する必要があります。 シェルから find を呼び出す場合、シェルがセミコロンを制御演算子として扱うなら、引用符で囲む必要があるかもしれません。文字列「{}」が utilety 名や argument のどこかに現れると、それは現在のファイルのパス名で置き換えられます。 command は find が実行されたディレクトリから実行されます。 command と argument は、シェルのパターンや構成要素のさらなる拡張の対象にはならない。
1# log または SELECT というディレクトリに対して true を返す 2# log または SELECT を対象外として走査し、見つかったファイルが出力される 3find . -type d \( -name log -o -name SELECT \) -prune -o -type f -print
-prune
- true を返します。 処理対象がディレクトリである場合、ディレクトリ内に入っていきません。
- expression
-o
expression - expression
-or
expression -o
,-or
演算子は、論理的なOR演算子です。 この式は、第1式または第2式のいずれかが true である場合に true と評価されます。 最初の式が true である場合、2番目の式は評価されません。-or
はPOSIX には準拠していません。1$ # 上記の -newer の例で示したファイルリストを使ってテスト 2$ find . -name "*.txt" ! -newermt "20230720" | sort 3./20230718-000000.txt 4./20230718-235959.txt 5./20230719-000000.txt 6./20230719-235959.txt 7./20230720-000000.txt 8$ # 更新日時が2023年7月19日のファイルを抽出 9$ find . -name "*.txt" -newermt "20230718 23:59:59" ! -newermt "20230719 23:59:59" | sort 10./20230719-000000.txt 11./20230719-235959.txt
-newer
XY file- 対象ファイルのタイムスタンプ X が、file のタイムスタンプ Y より新しい場合は true を返します。 X と Y の位置に記述する文字は、 以下の文字とします。
a ファイルのアクセス日時 B ファイルの i ノード生成日時 c ファイルの i ノード変更日時 m ファイルの更新日時 t file に直接時間表現が書かれたとして解釈
組み合わせによっては、 無効になるものも発生します。 たとえば、 X に t を指定しても無効です。 またシステムによっては、 特定の組み合わせを実装していない場合があります。 たとえば B は、 すべてのシステムでサポートされているわけではありません。 指定された XY の組み合わせが、 無効や未サポートの場合は、 致命的エラーが発生します。 なお,-newermm は -newer と等価です。
!
expression- これは単項 NOT 演算子です。 式が false の場合、true と評価されます。
ftp
put ローカルマシンのファイル名 [リモートマシンに出力するファイル名]
grep
-n
- 各出力行の前には、1行目から始まるファイル内の相対的な行番号が付きます。 行番号カウンターは、ファイルを処理するごとにリセットされます。 このオプションは、-c, -L, -l, または -q が指定されている場合、無視されます。
-v
- 選択された行は、指定されたパターンのいずれにも一致しない行です。
-w
- マッチする部分が完全な単語を形成するときにのみ、その行を選択します。 -x も指定されている場合、このオプションは効果がありません。
-x
- パターンが行全体とぴったりマッチしたときにのみ、その行を選択します。
-H
- 各々のマッチに対してそのファイル名を表示します。
1# /usr/binにてexecコマンドが記載されているラッパースクリプトを以下コマンドで探す
2# ただし、/usr/bin はバイナリファイルも存在するので、-I で除外する
3grep -Il "^[^#]*\s*exec\s" /usr/bin/*
-I
- バイナリファイルを無視します。 このオプションは、-binary-file=without-match オプションと同等です。
-l
-L
の逆。 選択された行を含むファイル名のみが標準出力に書き出される。 grepはマッチするファイルが見つかるまでファイル検索を行うので、検索コストが低くなる可能性がある。 パス名は、検索されたファイルごとに1回だけリストされる。 標準入力が検索された場合、--label
が指定されない限り、文字列 "(standard input)" が書き込まれる。-L
-l
の逆。 選択された行を含まないファイル名のみが標準出力に書き出される。 パス名は、検索されたファイルごとに1回だけリストされる。 標準入力が検索された場合、--label
が指定されない限り、文字列 "(standard input)" が書き込まれる。
1$ # 6番目の空白ごとに改行する(\s:空白、\S:空白以外)
2$ echo "State of A : RUN State of B : STOP State of C : RUN" |
3> grep -Eo '(\S+\s+){4}\S+'
4State of A : RUN
5State of B : STOP
6State of C : RUN
-o
- マッチする行のマッチした部分だけを (それが空文字列でなければ) 表示します。 マッチした各文字列は、それぞれ別の行に書き出します。
以下の例では、grepを使ってcsvの1〜4カラムがユニークな行のみを出力する。
1$ cat sample.csv
220230830,52678,004,Apple,21
320230830,52678,004,Apple,20
420230830,52678,004,Apple,19
520230831,47689,001,Orange,15
620230901,47620,002,Grape,29
7$ cut -d, -f 1-4 sample.csv | uniq -d # uniqコマンドの-dオプションは重複行のみを出力する
820230830,52678,004,Apple
9$ grep -vF -f <(cut -d, -f 1-4 sample.csv | uniq -d) sample.csv
1020230831,47689,001,Orange,15
1120230901,47620,002,Grape,29
-F
- PATTERN を改行で区切られた固定文字列 (正規表現のかわりに) のリストとして扱い、 その文字列のいずれかとマッチするかどうかを調べます。
-f
FILE- パターンを FILE から 1 行 1 パターンとして読み込みます。 このオプションを複数回使ったときや、 -e (--regexp) オプションと組み合わせたときは、与えられたすべてのパターンを検索します。 空のファイルはパターンを含まないので、何にもマッチしません。
hexdump
ファイルの内容を 16 進数、10 進数、8 進数、ASCII 文字で表示します。
1$ hexdump -Cv sample.txt
200000000 48 65 6c 6c 6f 2c 77 6f 72 6c 64 21 0a 0a |Hello,world!..|
30000000e
-C
- 標準的な 16 進数 + ASCII での表示。 入力オフセットを 16 進数で表示し、その後に、入力データを 1 バイトずつ 2 桁の 16 進数で表現し、それを 1 行当たり 16 個、空白で区切って表示します。 その後に、2 つの '|' で囲まれた中に同じ 16 バイトを %_p フォーマットで表示します。
-v
- 入力データをすべて表示するようになります。 -v オプションを指定しない場合は、直前の出力行と (入力オフセット以外が) 同じ内容の行は、何行であっても、ただ 1 個のアスタリスクからなる 1 行に置き換えられます。
hostname
現在システムのホスト名の設定と変更
-s
- 出力された名前からドメイン情報を削除します。
ls
-R
- 見つかったサブディレクトリを再帰的にリスト表示します。
screen
1つの端末内に複数の端末を仮想的に起動する。 ログアウトしても exit などで閉じていなければ仮想的な端末(ウィンドウ)は維持され、次回ログイン時にアクセスすることができる。 ssh で長時間ジョブ実行の途中で突然切断されても、 screen セッション内で動かしていれば、ジョブの実行は継続される。
新しいセッション作成時は、同時にウィンドウも作成され、アタッチの状態となる。ウィンドウには新規にデバイスファイル名が割り当てられる。
-S
セッション名- 新しいセッションを作る際、 セッションを識別できる名前をつける。
ctrl + a
を押した後にctrl + d
か単にd
を押す- 現在の端末からデタッチする。
-r
[セッション名]- 指定のセッションにアタッチする。存在するセッションが一つだけの場合は、セッション名の指定は不要。
-ls
- セッションの一覧とセッションのPIDを表示
下図の例では、リモートにssh接続してscreenセッションを作成し、sleep を実行している。一度ssh接続を切って再接続しても、sleep処理は中断することなく続行している。 ※ただし業務で screen を使うことは基本ない。そもそもバックグラウンド実行できないケースに当たったことがない。基本的には nohup command & の実行で問題ないだろう。
◆参考サイト
【図解】screenコマンド入門(迷子向け)
Linux screenコマンド使い方
touch
ファイルのタイムスタンプを変更する
1$ touch -d "2023-07-1723:59:59" sample.txt
2$ ls -l sample.txt
3-rw-r--r-- 1 fuku fuku 0 7 17 23:59 sample.txt
4$ touch -d "230717" sample.txt # この形式はmacOSでは使えない
5$ ls -l sample.txt
6-rw-r--r-- 1 fuku fuku 0 7 17 00:00 sample.txt
-d
STRING- 現在時刻の代わりに STRING を解釈して使用する
tty
接続端末のデバイスファイル名を表示する
1$ tty
2/dev/ttys001
vmstat
仮想メモリの統計を報告vmstat [-a] [-n]
[delay[ count]]
-a
- アクティブ/非アクティブなメモリの量を表示する(カーネル2.5.41以降)。
-n
- ヘッダの表示が一度だけになる。 デフォルトでは、一定の周期でヘッダが繰り返し表示される。
- delay
- 更新の間隔。単位は秒。 delay が指定されなければ、最後の起動以降の平均値が 1 回だけ報告される。
- count
- 更新の回数。 count が指定されず、 delay が指定されている場合は、 count のデフォルトは無限回になる。

◆表示内容
- procs
- r
- 実行中と実行街中のプロセス数の合計
- b
- 割り込み不可能なスリープ状態にあるプロセス数
- memory
- swpd
- 使用中の仮想メモリの量
- free
- 空きメモリの量
- buff
- バッファとして使用しているメモリの量
- cache
- キャッシュに使用している量
- swap
- si
- ディスクからスワップインしているメモリの量
- so
- スワップアウトしている量
- io
- bi
- HDDのようなブロック型デバイスから受け取ったブロック数
- bo
- ブロック型デバイスに送ったブロック数
- system
- in
- 1秒あたりの割り込み回数(クロック割り込みを含む)
- cs
- 1秒あたりのコンテクストスイッチの回数
- cpu
- us
- カーネルコード以外の実行に使用した時間(ユーザー時間)
- sy
- カーネルコードの実行に使用した時間(システム時間)
- id
- 空転していたアイドル時間
- wa
- I/O待ち時間
- st
- 仮想マシンから“盗まれた”時間(仮想環境使用時)
xargs
xargs
[options] [command [initial-arguments]]
xargs ユーティリティは、スペース、タブ、改行、ファイル終端の区切られた文字列を標準入力から読み込み、その文字列を引数としてユーティリティを実行します。
コマンドラインで指定された引数は、各呼び出し時にユーティリティに与えられ、その後に xargs の標準入力から読み込まれた引数がいくつか続きます。 これは、標準入力がなくなるまで繰り返されます。
スペース、タブ、改行は、シングルクォート、ダブルクォート、バックスラッシュを使用して引数に埋め込むことができます。 シングルクォートは、改行を除くすべての非シングルクォート文字を、マッチするシングルクォートまでエスケープします。 二重引用符は、改行を除くすべての二重引用符以外の文字を、一致する二重引用符までエスケープします。 改行を含むすべての1文字は、バックスラッシュでエスケープすることができます。
1# find コマンドで ${RECEIVE_DIR} のファイル名を取得し、
2# ファイル名に日付を付けて ${BKUP_DIR} に移動する
3find ${RECEIVE_DIR}/ -maxdepth 1 -type f -name "*.gz" -exec basename {} ¥; | \
4xargs —no-run-if-empty -I mv -f ${RECEIVE_DIR}/{} ${BKUP_DIR}/${DATE}_{} 2>&
-I
replace-str- initial-arguments 中で文字列 replace-str が現れるすべての箇所を、 標準入力から読み込んだ名前で置き換えます。 なお、 標準入力中にクォートされていない空白があっても、 それは入力項目の区切りにはなりません。 区切り文字は改行文字だけになります。 -x と -L 1 の指定を暗に含みます。
※おそらく replace-str 省略時は -I {} と同じこととなる。
--no-run-if-empty
- 標準入力に空白しか含まれていない場合は、 指定したコマンドを実行しません。 通常では、 入力が全くない場合でも、 コマンドが一回は実行されます。 このオプションは GNU 拡張です。