コマンドラインツール¶
UNIX系のコマンドラインツールをまとめます。
ファイルを扱う¶
ファイル名の操作¶
rename(perl版)¶
OS: debian系Linux(ほぼ標準), macOS(Homebrewで利用可)
ファイル名を変更するコマンドで、Perl系の正規表現でrenameできます。
ファイル名の拡張子直前の数字をゼロパディングしたい¶
たとえば、alfa_bravo-20220809-1.dat
というファイル名をalfa_bravo-20220809-01.dat
のように、拡張子直前の数字が一桁のときは0をパディングして数字二桁にしたいとします。
% rename 's/(.*-)(\d+).dat/sprintf("%s%02d.dat", $1, $2)/e' alfa_bravo-20220809-1.dat
お試し(Dry run)時は、-nオプションを指定
rename¶
ファイル名を変更するコマンドです。書式は次で、複数ファイルに対してファイル名に含まれる置換前文字列を置換後文字列に置換します。rename 置換前文字列 置換後文字列 ファイル名...
バイナリファイルの表示¶
hexdump¶
ファイルをバイナリおよび文字で表示します。
1バイトごとに表示し、対応する文字を右端に表示させる、おなじみの形式は、オプション -C
を指定します。
MacBook hash % hexdump -C greeting.txt 00000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a |Hello, world.| 0000000d
xdd¶
ファイルをバイナリ表示します。
1バイトごとに表示するオプション -g 1
を指定します。
MacBook hash % xxd -g 1 greeting.txt 00000000: 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a Hello, world.
od¶
ファイルをバイナリ表示します。
1バイトごとに16進表示するオプション -tx1
と、アドレスを16進表示するオプション -Ax
を指定します。
MacBook hash % od -Ax -tx1 greeting.txt 0000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a 000000d
バイナリに対応する文字の表示は、GNU系とBSD系でオプションと表示形式が異なります。
BSD系の文字表示¶
バイナリに対応する文字は、右端に表示はできませんが、バイナリ表示の下に表示させるオプション -c
があります。
BSD系の振る舞いとなり、GNU系のodと異なります。
MacBook hash % od -Ax -tx1c greeting.txt 0000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a H e l l o , w o r l d \n 000000d
ファイルを名前順に処理¶
ファイルの末尾の数字(alfa_1.txt, alfa_2.txt, ...)順に処理¶
% for f in $(ls alfa* | sort -V); do echo $f; done
通常の`ls`コマンドでは、数字が、1,2,3,..10,11,12のように桁が異なる場合に期待する順番に並べることができません。(1, 10, 11,12, 2, 3...のように並ぶ)
テキストファイルの処理¶
awk¶
ファイルの検索と処理¶
find¶
ファイル・ディレクトリのコピーや移動¶
rsync¶
異なる2つのディレクトリ間のディレクトリ・ファイルの同期を行います。
mv¶
ファイルまたはディレクトリを移動します。
移動元、移動先が異なるファイルシステム(デバイス)の時は、inter-device move failed: /path/to/origin to /path/to/dest; unable to remove target: Directory not empty
などのメッセージが出ることがあります。
ファイルシステム¶
ディレクトリ毎の使用量¶
duコマンドで、ディレクトリ毎のディスク使用量を確認します。
~$ du -s -h 31G Documents 24G Downloads 10M tmp 8G work
マウント先のディレクトリをスキップ¶
ディスク使用量の調査では、ネットワークマウントしたディレクトリは対象外とすることが多いです。また、ネットワークドライブはduの処理に時間を要します。-x
オプションを指定すると、duコマンドで指定したパスのサブディレクトリが別ファイルシステムへのマウントポイントの場合にそのディレクトリをスキップします。
パイプ処理¶
パイプ処理¶
あるプロセスの標準出力を、別なプロセスの標準入力につなぐことで、複数のプロセスを組み合わせた処理が可能となります。
- 例)findでファイルを見つけてそのファイルの中身をgrepする。
find . -name "*log" | xargs grep "ERROR"
標準出力を標準入力に繋げる | | |
標準出力と標準エラー出力を標準入力に繋げる | |& |
パイプで渡されたテキストの処理¶
xargs¶
xargsは、標準入力で受け取ったテキストを最大サイズで分割してオプションに指定されるコマンドに渡します。分割が発生する場合、繰り返しオプションに指定されるコマンドに分割したテキストを順番に渡して実行します。
典型的なユースケースは、findコマンドでprintしたファイルリストをxargsにパイプで渡してコマンドを実行するものです。
find . -name "*.log" -print | xargs grep "ERROR"
プレースホルダ¶
標準入力で渡されるテキストリストに対して加工が必要な場合、xargsに-I <プレースホルダー>
オプションを指定し、テキストリストのそれぞれをプレースホルダーで指定します。
cat processed_file.txt | xargs -I XXFILE mv XXFILE XXFILE.done
このオプションを指定すると、渡されたテキストリストの一つ一つについてコマンドが実行されます。
デフォルトのプレースホルダー{}
を使う場合、-iオプションで簡潔に指定できます。
cat processed_file.txt | xargs -i mv {} {}.done
複数コマンドを実行¶
xargsで、複数のコマンドを実行する場合は、サブシェルで実行します。
cat processed_file.txt | xargs -i sh -c "echo {}; mv {} {}.done"
シェル関数を実行¶
xargsでシェル関数を実行する場合は、シェル関数をexportしてから、xargsのコマンドをサブシェルで実行します。
function do_something() {
:
}
export -f do_something
cat processed_file.txt | xargs -i bash -c "do_something {}"
渡されたテキストリストを1つずつコマンドに渡して実行¶
findなどで検索したファイルパスのリストを、パイプでxargsに渡し、basename(パスからファイル名を取り出す)やdirname(パスからディレクトリ名を取り出す)を実行したいとします。basenameやdirnameは、引数を1つだけ受け取るので、引数を複数渡された場合、処理ができません。
xargs -L 1 basename
そこで、上のように-L
オプションでコマンドに渡す引数の数を1つに限定すると、渡されたファイルパスの一つ一つに対してbasenameコマンドを実行することができます。
並列実行¶
-P4
のように -Pオプションで数値を指定すると、指定した数だけ並列実行します(CPUのコア数内で)。
tee¶
パイプで渡されたテキストを標準出力に表示するとともに、ファイルに保存します。
~$ some_proc | tee some_proc.log
ファイルに追記する場合は、tee -a some_proc.log
のように -aオプションを指定します。
ネットワークを扱う¶
ネットワークの調査¶
netstat¶
ネットワークの接続、待ち受けの状況を調べるコマンドです。
オプションの使い方
- デフォルトは、接続済み(ESTABLISHED)のみ表示、
-l
接続待ち(LISTEN)のみ表示、-a
全ての状態を表示 - ホスト名の名前解決をしない
-n
: 名前解決の時間だけコマンドの結果が遅くなる - デフォルトは全てのプロトコルを表示、
-t
でTCPのみ表示、-u
でUDPのみ表示 - ポートを使用しているプログラム名を表示
-p
- インタフェースごとのパケット統計を表示
-i
パケット統計(-i
)¶
ネットワークインタフェースごとに、MTU値、メトリック数、正常受信パケット数、受信エラーパケット数、受信破棄パケット数、受信オーバーロードパケット数、正常送信パケット数、送信エラーパケット数、送信破棄パケット数、送信オーバーロードパケット数、フラグを表示します。
数は、起動時からの累積です。
ネットワーク統計(-s
)¶
ホストのIP、TCP/UDP、ICMPなどのプロトコル種類ごとの統計情報を表示します。
連続表示 (-c
)¶
毎秒処理を実行して表示します。