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"
-q, --brief
ファイルが違うかどうかだけを報告する。

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

ファイル階層をたどる

-type c
c で表されるタイプのファイルならば真。 c としては以下がある:
b
ブロックスペシャルファイル (バッファ付き)
c
キャラクタスペシャルファイル (バッファ無し)
d
ディレクトリ
p
名前付きパイプ (FIFO)
f
通常のファイル
l
シンボリックリンク
s
ソケット
-maxdepth levels
検索開始ポイントから最大で levels で示される階層数のディレクトリまで検索します (levels は負ではない整数です)。 -maxdepth 0 を指定すると、テストやアクションの対象は検索開始ポイントだけになります。
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>&
-exec command [argument ...] ;
command を実行します。 command の返り値が 0 なら true を返します。 オプションの引数は command に渡すことができます。 式はセミコロン(";")で終了する必要があります。 シェルから find を呼び出す場合、シェルがセミコロンを制御演算子として扱うなら、引用符で囲む必要があるかもしれません。文字列「{}」が utilety 名や argument のどこかに現れると、それは現在のファイルのパス名で置き換えられます。 command は find が実行されたディレクトリから実行されます。 commandargument は、シェルのパターンや構成要素のさらなる拡張の対象にはならない。
-prune
true を返します。 処理対象がディレクトリである場合、ディレクトリ内に入っていきません。
1# log または SELECT というディレクトリに対して true を返す
2# log または SELECT を対象外として走査し、見つかったファイルが出力される
3find . -type d \( -name log -o -name SELECT \) -prune -o -type f -print
expression -o expression
expression -or expression
-o, -or 演算子は、論理的なOR演算子です。 この式は、第1式または第2式のいずれかが true である場合に true と評価されます。 最初の式が true である場合、2番目の式は評価されません。 -orはPOSIX には準拠していません。
 1$ # 下記の例ではファイル名をタイムスタンプに一致させている
 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
各々のマッチに対してそのファイル名を表示します。
-h
出力時のファイル名のプレフィックスを抑制する。 これは、検索するファイルが1つだけ(または標準入力だけ)の場合のデフォルトである。
-I
バイナリファイルを無視します。 このオプションは、-binary-file=without-match オプションと同等です。
1# /usr/binにてexecコマンドが記載されているラッパースクリプトを以下コマンドで探す
2# ただし、/usr/bin はバイナリファイルも存在するので、-I で除外する
3grep -Il "^[^#]*\s*exec\s" /usr/bin/*
-l
-L の逆。 選択された行を含むファイル名のみが標準出力に書き出される。 grepはマッチするファイルが見つかるまでファイル検索を行うので、検索コストが低くなる可能性がある。 パス名は、検索されたファイルごとに1回だけリストされる。 標準入力が検索された場合、 --label が指定されない限り、文字列 "(standard input)" が書き込まれる。
-L
-l の逆。 選択された行を含まないファイル名のみが標準出力に書き出される。 パス名は、検索されたファイルごとに1回だけリストされる。 標準入力が検索された場合、 --label が指定されない限り、文字列 "(standard input)" が書き込まれる。
-o
マッチする行のマッチした部分だけを (それが空文字列でなければ) 表示します。 マッチした各文字列は、それぞれ別の行に書き出します。
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
-F
PATTERN を改行で区切られた固定文字列 (正規表現のかわりに) のリストとして扱い、 その文字列のいずれかとマッチするかどうかを調べます。
-f FILE
パターンを FILE から 1 行 1 パターンとして読み込みます。 このオプションを複数回使ったときや、 -e (--regexp) オプションと組み合わせたときは、与えられたすべてのパターンを検索します。 空のファイルはパターンを含まないので、何にもマッチしません。

以下の例では、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
-q, --quiet, --silent
沈黙。通常の出力を抑止します。 スキャン動作は最初のマッチで終了します。 -s や --no-messages オプションも参照。
1$ ### bash配列の存在チェック ###
2$ array=('apple' 'orange' 'banana' 'peach')
3$ grep -wq "banana" <<< "${array[@]}"
4$ echo $?
50
6$ grep -wq "bana" <<< "${array[@]}"
7$ echo $?
81
-r, --recursive
シンボリックリンクがコマンドライン上にある場合にのみ、再帰的に各ディレクトリ以下のすべてのファイルを読み込む。 ファイルオペランドが与えられない場合、 grep は作業ディレクトリを検索することに注意。 これは -d recurse オプションと等価である。
-R
各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。 -r とは異なり、すべてのシンボリックリンクをたどります。
-s, --no-messages
指定されたファイルが存在しないことや読み込みできないことを示す エラーメッセージを抑止します。

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
出力された名前からドメイン情報を削除します。

kill

外部コマンドとしてのkillを使うと、kill -0 $pid でプロセスID(pid)の存在チェックができます。
「0」シグナルを使うことで、プロセスが存在しているかどうかを確認できますが、プロセスに対して実際のシグナルが送られるわけではありません。これにより、kill コマンドの返り値を確認することで、プロセスの存在有無を判断できます。プロセスが存在すればコマンドは成功し、存在しなければエラーが返されます。

1# プロセスの存在をチェック
2if kill -0 "$pid" 2>/dev/null; then
3    echo "Process $pid exists."
4fi

ちなみにpsコマンドでも同等のチェックが可能

1if ps -p "$pid" > /dev/null; then
2    echo "Process $pid exists."
3fi

ls

-a, --all
. で始まるエントリーを無視しない。
-d, --directory
ディレクトリの内容ではなくディレクトリ自体をリストします。
-i, --inode
各ファイルのインデックス番号(inode番号)を出力します。
-R
見つかったサブディレクトリを再帰的にリスト表示します。
--full-time
'-l --time-style=full-iso' と同じ
1$ # findした結果を更新日時でソートして表示
2$ find DIR -type f | xargs ls --full-time | sort -k6,7
--time-style=TIME_STYLE
-l を使用した時刻/日付形式。TIME_STYLE 引数には、full-iso、long-iso、iso、locale、または +FORMAT を指定できます。 FORMAT は date(1) と同様に解釈されます。 FORMAT が FORMAT1FORMAT2 の場合、FORMAT1 は最近使用していないファイルに適用され、FORMAT2 は最近使用したファイルに適用されます。 'posix-' という接頭辞が付いた TIME_STYLE は、POSIX ロケールの外でのみ有効です。 また、TIME_STYLE 環境変数は、使用するデフォルトのスタイルを設定します。
1$ # findした結果を更新日時でソートして表示
2$ find DIR -type f | xargs ls -l --time-style='+%Y%m%d%H%M%S'  | sort -k6,6

-S
ファイルサイズでソートします。デフォルトでは、サイズの大きい順に表示されます。
 1$ ls -lS
 2合計 40
 3-rw-r--r--. 1 dam user 20480  7月 30 16:43 file3.txt
 4-rw-r--r--. 1 dam user 10240  7月 30 16:42 file1.txt
 5-rw-r--r--. 1 dam user  5120  7月 30 16:43 file2.txt
 6$ ls -lSr
 7合計 40
 8-rw-r--r--. 1 dam user  5120  7月 30 16:43 file2.txt
 9-rw-r--r--. 1 dam user 10240  7月 30 16:42 file1.txt
10-rw-r--r--. 1 dam user 20480  7月 30 16:43 file3.txt

lsof

lsof コマンド(List Open Files)は、LinuxおよびUNIX系のオペレーティングシステムで、システム上で現在開かれているファイルやプロセスの情報を表示するためのツールです。ファイルディスクリプタやネットワーク接続、デバイスなど、様々な「オープン」なリソースについての情報を提供します。

主な機能とオプション

  • 全てのオープンファイルを表示:

    1lsof
    

    このコマンドを実行すると、システム上で現在オープンされているすべてのファイルのリストが表示されます。

  • 特定のプロセスによって開かれているファイルを表示:

    1lsof -p <PID>
    

    ここで <PID> はプロセスIDです。このコマンドは、指定したプロセスが開いているファイルのリストを表示します。

  • 特定のユーザーによって開かれているファイルを表示:

    1lsof -u <username>
    

    ここで <username> はユーザー名です。指定したユーザーが開いているファイルのリストが表示されます。

  • 特定のファイルやディレクトリが開かれているか確認:

    1lsof <filename>
    

    ここで <filename> はファイル名またはディレクトリ名です。このコマンドは、指定したファイルやディレクトリを開いているプロセスのリストを表示します。

  • ネットワーク接続の情報を表示:

    1lsof -i
    

    このコマンドは、ネットワーク接続のリストを表示します。特定のプロトコル(TCP、UDPなど)やポート番号に基づいてフィルタリングすることもできます。

  • 特定のポートやプロトコルに基づいてフィルタリング:

    1lsof -i :<port>
    

    ここで <port> はポート番号です。指定したポートを使用しているプロセスのリストを表示します。

  • 特定のネットワークプロトコルに基づいてフィルタリング:

    1lsof -i <protocol>
    

    ここで <protocol>tcpudp などのプロトコルです。指定したプロトコルを使用しているファイルのリストを表示します。

主な出力フィールド

lsof コマンドの出力には、以下のような情報が含まれます:

  • COMMAND: ファイルを開いているコマンドやプロセスの名前。
  • PID: プロセスID。
  • USER: ファイルを開いているユーザーの名前。
  • FD: ファイルディスクリプタ。cwd(カレントディレクトリ)、txt(実行ファイル)、mem(メモリマッピング)など。
  • TYPE: ファイルのタイプ。REG(通常ファイル)、DIR(ディレクトリ)、CHR(キャラクタデバイス)など。
  • DEVICE: デバイス番号。
  • SIZE/OFF: ファイルのサイズまたはオフセット。
  • NODE: ノード番号(ファイルシステム内でのファイルの識別子)。
  • NAME: ファイルの名前やパス、またはネットワーク接続の情報。

使用例

  • 特定のファイルがどのプロセスによって使用されているか確認:

    1lsof /path/to/file
    
  • 特定のポートでリッスンしているプロセスを確認:

    1lsof -i :80
    
  • ネットワーク接続の情報を表示:

    1lsof -i
    
  • 特定のプロセスが開いているファイルを確認:

    1lsof -p 1234
    

これにより、ファイルシステムやネットワークのトラブルシューティング、セキュリティの監視、システムのパフォーマンスの診断などに役立つ情報を取得できます。

mkdir

mkdir - ディレクトリを作成する

-p
引き数に指定した各々の directory で、存在しない親ディレクトリも含めて作成する。 作成された親ディレクトリのアクセス権は、 umask の値に u+wx としたものが設定される。 すでに存在するディレクトリに対応する引き数は無視される。 (従って、ディレクトリ /a が存在する場合に mkdir /a とするとエラーとなるが、 mkdir -p /a とするとエラーにならない。)
 1$ mkdir a/b/c
 2mkdir: a/b: No such file or directory
 3$ mkdir -p a/b/c
 4$ ls -lR a
 5total 0
 6drwxr-xr-x   3 fuku  wheel   96 11  9 10:02 ./
 7drwxrwxrwt  12 root  wheel  384 11  9 10:02 ../
 8drwxr-xr-x   3 fuku  wheel   96 11  9 10:02 b/
 9
10a/b:
11total 0
12drwxr-xr-x  3 fuku  wheel  96 11  9 10:02 ./
13drwxr-xr-x  3 fuku  wheel  96 11  9 10:02 ../
14drwxr-xr-x  2 fuku  wheel  64 11  9 10:02 c/
15
16a/b/c:
17total 0
18drwxr-xr-x  2 fuku  wheel  64 11  9 10:02 ./
19drwxr-xr-x  3 fuku  wheel  96 11  9 10:02 ../
20$ umask
210022

od

od - 8 進数およびその他の形式でファイルをダンプする (Octal Dump)

-c
ファイルの内容を 8 進数ではなく、文字として表示する。 改行は \n として表示される。
1$ cat test.txt
2Hello, World!
3$ od -c test.txt
40000000   H   e   l   l   o   ,       W   o   r   l   d   !  \n
50000015

realpath

ここからは以下リンク先の翻訳結果。
https://www.gnu.org/software/coreutils/manual/html_node/realpath-invocation.html#realpath-invocation

realpath はすべてのシンボリック リンクを展開し、「/./」、「/../」、および余分な「/」文字への参照を解決します。 デフォルトでは、指定されたファイルの最後のコンポーネントを除くすべてのコンポーネントが存在する必要があります。

SYNOPSIS
realpath [option]… file…

ファイル名の正規化機能は、readlink コマンドの機能と重複します。 これは、より適切で標準的な名前であるため、正規化に推奨されるコマンドです。 さらに、このコマンドは相対ファイル名処理機能をサポートします。

プログラムは次のオプションを受け入れます。 Common options も参照してください。

-e, --canonicalize-existing
指定したファイル名のすべてのコンポーネントが存在することを確認する。 いずれかのコンポーネントが欠落しているか使用できない場合、-q オプションが指定されていない限り、realpath は診断を出力し、ゼロ以外の終了コードで終了します。 末尾のスラッシュは、名前がディレクトリに解決されることを要求します。
-m, --canonicalize-missing
指定されたファイル名のコンポーネントが欠落しているか、使用できない場合は、それをディレクトリとして扱います。
-L, --logical
シンボリック リンクは指定されたファイル名で解決されますが、後続の「..」コンポーネントが処理された後に解決されます。
-P, --physical
シンボリック リンクは指定されたファイル名で解決され、後続の「..」コンポーネントが処理される前に解決されます。 これはデフォルトの動作モードです。
-q, --quiet
指定したファイル名の診断メッセージを抑制します。
--relative-to=dir
指定されたディレクトリからの相対パスで解決されたファイル名を表示します。 このオプションは、ファイルの存在に関する -m オプションと -e オプションに優先します。
--relative-base=dir
ファイルが dir の子孫である場合、解決されたファイル名を相対ファイル名として表示します。 そうでない場合は、解決されたファイル名を絶対ファイル名として表示します。 このオプションは、ファイルの存在に関する -m オプションと -e オプションを優先する。 relative-to と --relative-base の組み合わせの詳細については、 Realpath の使用例を参照のこと。
-s, --strip, --no-symlinks
シンボリック リンクを解決しません。 「/./」、「/../」への参照のみを解決し、余分な「/」文字を削除します。 -m オプションと組み合わせると、realpath はファイル名のみに作用し、実際のファイルには影響しません。
-z, --zero
各行の末尾に改行ではなくゼロバイト (ASCII NUL) を出力します。 このオプションを使用すると、出力に改行が埋め込まれたデータが含まれる場合でも、他のプログラムが出力を解析できるようになります。
終了ステータス

すべてのファイル名が問題なく出力された場合は 0。
それ以外の場合は 1。

Realpath の使用例

ここからは以下リンク先の翻訳結果。
https://www.gnu.org/software/coreutils/manual/html_node/Realpath-usage-examples.html

デフォルトでは、realpath は指定されたファイルの絶対ファイル名を出力します (シンボリックリンクは解決され、words は american-english に解決されます)。 ※ words は american-english のシンボリックリンクとする。

1cd /home/user
2realpath /usr/bin/sort /tmp/foo /usr/share/dict/words 1.txt
3⇒ /usr/bin/sort
4⇒ /tmp/foo
5⇒ /usr/share/dict/american-english
6⇒ /home/user/1.txt

--relative-to を使用すると、指定されたディレクトリを基準にしてファイル名が出力されます。

1realpath --relative-to=/usr/bin \
2         /usr/bin/sort /tmp/foo /usr/share/dict/words 1.txt
3⇒ sort
4⇒ ../../tmp/foo
5⇒ ../share/dict/american-english
6⇒ ../../home/user/1.txt

--relative-base を使用すると、解決されたファイル名が指定されたベース ディレクトリの下にある場合、相対ファイル名が出力されます。 ベース ディレクトリの外にあるファイルの場合は、絶対ファイル名が出力されます。

1realpath --relative-base=/usr \
2         /usr/bin/sort /tmp/foo /usr/share/dict/words 1.txt
3⇒ bin/sort
4⇒ /tmp/foo
5⇒ share/dict/american-english
6⇒ /home/user/1.txt

--relative-to=DIR1--relative-base=DIR2 の両方を使用すると、ファイル名が dir2 の下にある場合は、dir1 を基準にして出力されます。 ファイルが dir2 以下にない場合は、絶対ファイル名として出力されます。

1realpath --relative-to=/usr/bin --relative-base=/usr \
2         /usr/bin/sort /tmp/foo /usr/share/dict/words 1.txt
3⇒ sort
4⇒ /tmp/foo
5⇒ ../share/dict/american-english
6⇒ /home/user/1.txt

--relative-to=DIR1--relative-base=DIR2 の両方を使用する場合、dir1 は dir2 のサブディレクトリである必要があります。 それ以外の場合、realpath は絶対ファイル名を出力します。

sar

NAME

システムアクティビティ情報を収集、レポート、または保存する。

SYNOPSIS

sar [ -A ] [ -b ] [ -r [ ALL ] ] [ -u [ ALL ] ] [ -P { cpu_list | ALL } ] [ -f [ filename ] | -o [ filename ] | -[0-9]+ ] [ interval [ count ] ]

※ sar には多数のオプションが存在するが、以下で説明するもの以外は省略した。

DESCRIPTION

sar コマンドは、オペレーティング システムで選択された累積アクティビティ カウンターの内容を標準出力に書き込みます。 アカウンティング システムは、 count パラメータと interval パラメータの値に基づいて、秒単位で指定された間隔で、指定された回数だけ情報を書き込みます。 interval パラメータがゼロに設定されている場合、sar コマンドはシステムの起動以降の平均統計を表示します。 count パラメータを指定せずに interval パラメータを指定した場合、レポートは継続的に生成されます。 収集したデータは、画面に表示するだけでなく、 -o filename フラグで指定したファイルに保存することもできます。 filename が省略された場合、sar は標準のシステム アクティビティ日次データ ファイル (以下を参照) を使用します。 デフォルトでは、カーネルから利用可能なすべてのデータはデータ ファイルに保存されます。

sar コマンドは、以前にファイルに保存されたレコードを取り出して標準出力に書き出します。 このファイルは、-f フラグで指定されたファイル、またはデフォルトで標準のシステム アクティビティ日次データ ファイルのいずれかになります。 sar の引数に -1-2 などを入力して、その日前のデータを表示することも可能です。 たとえば、-1 は昨日の標準システム アクティビティ ファイルを指します。

標準のシステム アクティビティ日次データ ファイルの名前は saDD または saYYYYMMDD です。ここで、 YYYY は現在の年、 MM は現在の月、 DD は現在の日を表します。 これらは、ファイル名が明示的に指定されていない場合にのみ、sar によって使用されるデフォルトのファイルです。 (オプション -o を使用して) ファイルにデータを書き込むために使用される場合、sar は、オプション -D も指定されていれば saYYYYMMDD を使用し、それ以外の場合は saDD を使用します。 以前にファイルに保存されたレコードを表示するために使用される場合、sarsaDD および saYYYYMMDD の最新のものを検索して使用します。

標準のシステム アクティビティの日次データ ファイルは、デフォルトで /var/log/sa ディレクトリにあります。 ただし、それらの代替の場所を指定することは可能です。(プレーン ファイルの代わりに) ディレクトリがオプション -f または -o とともに使用される場合、それはデータ ファイルを含むディレクトリとみなされます。

-P フラグを指定しないと、sar コマンドはシステム全体 (すべてのプロセッサー間でグローバル) の統計を報告します。統計は、パーセンテージで表される値の平均として計算され、それ以外の場合は合計として計算されます。 -P フラグが指定されている場合、sar コマンドは、指定されたプロセッサーに関連するアクティビティーを報告します。 -P ALL を指定すると、sar コマンドは個々のプロセッサーの統計情報とすべてのプロセッサー間のグローバル統計情報を報告します。 オフラインのプロセッサは表示されません。

フラグを使用して、特定のシステムアクティビティに関する情報を選択できます。 フラグを指定しないと、CPU アクティビティのみが選択されます。 -A フラグを指定すると、考えられるすべてのアクティビティが選択されます。

sar コマンドのデフォルト バージョン (CPU 使用率レポート) は、主要なシステム リソースを監視するため、ユーザーがシステム アクティビティの調査を開始するために最初に実行する機能の 1 つとなります。 CPU 使用率が 100% (user + nice + system) に近い場合、サンプリングされたワークロードは CPU バウンドです。

複数のサンプルと複数のレポートが必要な場合は、sar コマンドの出力ファイルを指定すると便利です。 sar コマンドをバックグラウンド プロセスとして実行します。 この構文は次のとおりです。

sar -o datafile interval count >/dev/null 2>&1 &

すべてのデータはバイナリ形式でキャプチャされ、ファイル (データファイル) に保存されます。 データは、-f オプションを使用した sar コマンドで選択的に表示できます。 interval 秒間隔で count レコードを選択するには、 interval パラメータと count パラメータを設定します。 count パラメータが設定されていない場合は、ファイルに保存されているすべてのレコードが選択されます。 この方法でのデータの収集は、一定期間にわたるシステムの使用状況を特徴づけ、ピーク使用時間を決定するのに役立ちます。

注: sar コマンドは、ローカル アクティビティについてのみレポートします。

OPTIONS

-b
I/O および転送速度の統計をレポートする。 次の値が表示される。
tds
物理デバイスに発行された 1 秒あたりの転送の合計数。 転送は、物理デバイスへの I/O リクエストです。 複数の論理リクエストをデバイスへの単一の I/O リクエストに結合できます。 転送のサイズは不定です。
rtps
物理デバイスに発行された 1 秒あたりの読み取りリクエストの合計数。
wtps
物理デバイスに発行された 1 秒あたりの書き込みリクエストの合計数。
dtps
物理デバイスに発行された 1 秒あたりの破棄要求の合計数。
bread/s
デバイスから読み取られた 1 秒あたりのブロック単位のデータの総量。 ブロックはセクターに相当するため、サイズは 512 バイトになります。
bwrtn/s
デバイスに書き込まれる 1 秒あたりのブロック単位のデータの合計量。
bdscd/s
デバイスで破棄されたデータの合計量 (1 秒あたりのブロック単位)。
-r [ALL]
メモリ使用率の統計をレポートします。 ALL キーワードは、すべてのメモリ フィールドを表示する必要があることを示します。 次の値が表示される場合があります。
kbmemfree
利用可能な空きメモリの量 (キロバイト単位)
kbavail
スワップなしで新しいアプリケーションを起動するために使用できるメモリ量の推定値 (キロバイト単位)。 この見積もりでは、システムが適切に機能するにはある程度のページ キャッシュが必要であること、およびアイテムが使用中であるため、すべての再利用可能なスラブが再利用できるわけではないことが考慮されています。 これらの要因の影響はシステムごとに異なります。
kbmemused
使用されているメモリの量 (キロバイト単位) (合計インストール済みメモリ - kbmemfree - kbbuffers - kbcached - kbslab として計算)。
%memused
使用されているメモリの割合。
kbbuffers
カーネルによってバッファとして使用されるメモリの量 (キロバイト単位)。
kbcached
カーネルによってデータをキャッシュするために使用されるメモリの量 (キロバイト単位)。
kbcommit
現在のワークロードに必要なメモリ量 (キロバイト単位)。 これは、メモリ不足が発生しないことを保証するために必要な RAM/スワップの量の見積もりです。
%commit
メモリの合計量 (RAM+スワップ) に対する、現在のワークロードに必要なメモリの割合。 カーネルは通常メモリをオーバーコミットするため、この数値は 100% を超える場合があります。
kbactive
アクティブなメモリの量 (キロバイト単位) (最近使用され、通常は絶対に必要な場合を除き再利用されないメモリ)。
kbinact
非アクティブなメモリの量 (キロバイト単位) (最近使用されていないメモリ。他の目的で再利用するのに適したメモリ)。
kbdirty
ディスクへの書き込みを待機しているメモリ量 (キロバイト単位)。
kbanonpg
ユーザー空間のページ テーブルにマップされた非ファイル バック ページの量 (キロバイト単位)。
kbslab
カーネルが独自に使用するデータ構造をキャッシュするために使用するメモリ量 (キロバイト単位)。
kbkstack
カーネル スタック スペースに使用されるメモリ量 (キロバイト単位)。
kbpgtbl
最下位レベルのページ テーブル専用のメモリ量 (キロバイト単位)。
kbvmused
使用されている仮想アドレス空間のメモリ量 (キロバイト単位)。
-u [ALL]
CPU 使用率をレポートします。 ALL キーワードは、すべての CPU フィールドを表示する必要があることを示します。 レポートには次のフィールドが表示される場合があります。
%user
ユーザー レベル (アプリケーション) での実行中に発生した CPU 使用率のパーセンテージ。 このフィールドには、仮想プロセッサの実行に費やされた時間が含まれることに注意してください。
%usr
ユーザー レベル (アプリケーション) での実行中に発生した CPU 使用率のパーセンテージ。 このフィールドには、仮想プロセッサの実行に費やされた時間は含まれないことに注意してください。
%nice
nice 優先度を使用してユーザー レベルで実行中に発生した CPU 使用率のパーセンテージ。
%system
システム レベル (カーネル) での実行中に発生した CPU 使用率のパーセンテージ。 このフィールドには、ハードウェアおよびソフトウェアの割り込みの処理に費やされた時間が含まれることに注意してください。
%sys
システム レベル (カーネル) での実行中に発生した CPU 使用率のパーセンテージ。 このフィールドには、ハードウェアまたはソフトウェアの割り込みの処理に費やされた時間は含まれないことに注意してください。
%iowait
システムに未処理のディスク I/O 要求があったときに、CPU がアイドル状態だった時間の割合。
%steal
ハイパーバイザーが別の仮想プロセッサにサービスを提供している間に、仮想 CPU によって非自発的待機に費やされた時間の割合。
%irq
CPU がハードウェア割り込みの処理に費やした時間の割合。
%soft
ソフトウェア割り込みを処理するために CPU が費やした時間の割合。
%guest
仮想プロセッサを実行するために CPU が費やした時間の割合。
%gnice
適切なゲストを実行するために CPU が費やした時間の割合。
%idle
CPU がアイドル状態であり、システムに未処理のディスク I/O 要求がなかった時間の割合。

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 拡張です。
-n max-args, --max-args=max-args
コマンドラインあたりの引数は最大でmax-argsまで。 サイズ ( -s オプションを参照)を超えた場合は、 -x オプションが与えられていない限り、 max-args より少ない引数が使用されます。 この場合、xargs は終了します。(以下の -t の実行例を参照)
-t, --verbose
コマンドラインを実行する前に、標準エラー出力にコマンドラインを出力します。
 1$ find .
 2.
 3./dir
 4./dir/file2
 5./file1
 6$ find . | xargs -t
 7/bin/echo . ./dir ./dir/file2 ./file1
 8. ./dir ./dir/file2 ./file1
 9$ find . | xargs -t -n 1
10/bin/echo .
11.
12/bin/echo ./dir
13./dir
14/bin/echo ./dir/file2
15./dir/file2
16/bin/echo ./file1
17./file1
18$ find . | xargs -t -n 2
19/bin/echo . ./dir
20. ./dir
21/bin/echo ./dir/file2 ./file1
22./dir/file2 ./file1

関連ページ