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
45$ 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 が実行されたディレクトリから実行されます。 commandargument は、シェルのパターンや構成要素のさらなる拡張の対象にはならない。

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
-newerXY 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 拡張です。

関連ページ