Linux
coreutils

サーバ管理・運用者のためのGNU Coreutils

GNU CoreUtils

AWSなどでLinuxサーバを運用・管理していると、ログなどのテキストファイルを見たり調べたりすることが多い。
そのときに色々役に立つコマンドが幾つもあるのでメモ代わりに記述する。
これらの基本的なコマンドはGNU Coreutilsとしてまとめられて、標準的なプログラムとしてLinuxにインストールされている。
ファイルの操作など、よく使うものから、どこで使うかわからないものなど色々あるが、使いそうなコマンドを簡単な概要とともに、悪魔の辞典ふうに紹介する。実際にはこれらのコマンドを様々に組み合わせて使う。

これらのコマンドの詳細な情報は、こちらにある。
https://linuxjm.osdn.jp/info/GNU_coreutils/coreutils-ja.html

cat [option] [file]…

  • 標準出力に内容を出力する
  • 単に出力するという意味ではlessにその座を奪われている
  • ShellScriptでファイルの中身を変数に入れるときとかに使われたりする
  • 名前からして本来は複数のファイルを連結して、合成出力する目的だったが、圧倒的にファイルの中身を表示する用途に使われることが多いという元の意図と違う用途で使われることが多い
  • 良いユーザインタフェースと言われたり、悪いユーザインターフェースと言われたりするかわいそうなコマンド

head [option]… [file]…

  • ファイルの先頭部分を表示する
  • 余り使われてない

tail [option]… [file]…

  • 圧倒的によく使われるコマンド
  • ログファイルを -f オプションを付けて見てみるなど

split [option] [input [prefix]]

  • ファイルを行やバイトで分割する
  • 分割された後のファイルがちょっといけてない

csplit [option]… input pattern…

  • 正規表現などを使って特定の場所でファイル分割をする
  • 余り有名ではないけど、たまに使える
  • 正規表現にちょっと癖があるので注意

wc [option]… [file]…

  • バイト数、文字数、行数などを表示する
  • 圧倒的に行数を計算することに使われる

md5sum [option]… [file]…

  • ファイルの128-bit チェックサムを計算する。
  • 使い所としてはファイルの同一性チェックなど、確認するときに使う
  • コマンド名がながい(BSDではmd5)

sort [option]… [file]…

  • テキストファイルを並び替える
  • 後ででる uniq をする前にsortを掛けるのがワンセット

uniq [option]… [input [output]]

  • 行の重複を省く
  • ただし、きちんとsortされていないと、正しく動かないのでsortと組み合わせることがほとんど
  • 出現回数なども出力できる

cut option… [file]…

  • 行をセパレータで区切って、部分的に取り出す
  • cutしてsortしてuniqかけるのは鉄板操作

paste [option]… [file]…

  • 同じ行番号のものを指定したセパレータで連結する
  • 意外と使える場面があるとおもうのだけど、このコマンドを思い出せない

join [option]… file1 file2

  • 共通のフィールドにマッチする行を連結する
  • pasteとの違いは行ではなく同じフィールドで連結するところ
  • これもなかなか思いだせないのでVimでなんとかしてしまうかなしみ

tr [option]… set1 [set2]

  • 文字の置換を行う
  • なぜか標準入力からしか受け付けなくとっつきにく所もあって、頑張ってsedを使われてしまうことが多い

ls

  • ディレクトリの中身を表示する
  • オプションが多くて誰も把握できないと思われる

cp [option]…

  • ファイルのコピー
  • これもやたらとオプションが多い
  • cp source destination

mv [option]…

  • ファイルの移動
  • mv source destination
  • まずコピーをしてから元を消す動きをする

rm [option]… [file]…

  • ファイルの削除
  • 常に '-rf' のオプションを付けているといずれ痛い目を見る

ln [option]… target… directory

  • ファイル間のリンクを作成する
  • hard linkかsymbolic linkかわからなくなって消すときに悩む

chown [option]…

  • ファイルの所有者やグループを変更する
  • 間違ってrootで書き込んだログファイルの所有者を変えるときなどに使う

chmod [option]…

  • ファイルのアクセス権限を変更する
  • chmod 777は嫌な予感しかしない

touch [option]… file…

  • ファイルのタイムスタンプを変える
  • 空ファイルを作る目的で使われることが多い

df [option]… [file]…

  • ディスクの容量を表示する
  • -h をつけるとよしなにしてくれる

du [option]… [file]…

  • ディレクトリの容量を計算する
  • サーバのゴミデータを削除するときに使う

echo [option]… [string]…

  • テキストを1行表示する
  • 環境変数を表示するときによく使う

yes

  • ただただ、ひたすらに yes を標準出力に表示する
  • 高速化を目指して自己満足するためのコマンド
  • もしくはCPUを100%張り付かせるために使われるコマンド

pwd [option]…

  • カレントディレクトリを表示する
  • 迷子になったときに使う

date [option]…

  • 日付を表示する
  • フォーマットして様々な表示ができる
  • 表示をするとともに変更もできてしまうので少し怖い

uptime

  • 起動してからの時間、load average、ログインユーザ数を表示する
  • 何年も再起動してないサーバがいてびっくりするコマンド

kill

  • やんちゃなプロセスに退場いただくコマンド
  • respawn設定されてるプロセスと格闘するためのコマンド

あとがき

Unix系OSでは、パイプラインという偉大な仕組みがあり、上記のコマンドをパイプラインで組み合わせて、様々なことができる。ソフトウェアは工具だという思想があり、それを具現化させるための仕組みである。プログラムを書かなければいけないことを、コマンドの組み合わせでできてしまうことも多い。
考えて組み合わせる楽しみを体験してもらえればと。