プロジェクト

全般

プロフィール

コマンドラインツール

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オプションを指定

バイナリファイルの表示

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

awk

ファイルの検索と処理

find

findコマンド

パイプ処理

パイプで渡されたテキストの処理

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コマンドを実行することができます。

ネットワークを扱う

ネットワークの調査

netstat

ネットワークの接続、待ち受けの状況を調べるコマンドです。

オプションの使い方

  • デフォルトは、接続済み(ESTABLISHED)のみ表示、-l 接続待ち(LISTEN)のみ表示、-a 全ての状態を表示
  • ホスト名の名前解決をしない -n : 名前解決の時間だけコマンドの結果が遅くなる
  • デフォルトは全てのプロトコルを表示、-t でTCPのみ表示、-u でUDPのみ表示
  • ポートを使用しているプログラム名を表示 -p


8日前に更新