ファイルを書き換えない系linuxコマンド自分的まとめ
先週サーバ内の大事なファイルを見事に跡形もなく消し去ってしまい、十数年ぶりにおしっこ漏らしそうになってしまった訳なんですが(バックアップファイルがあったので何事もなかったけど)、今週は大事なファイルを間違えて上書きしてしまったために5日ぶりくらいにおしっこ漏らしそうになった訳であります。今回も偶然にもバックアップファイルがあったのと作業前にあまりジュースをゴクゴク飲んでたりという体調管理が万全だったために、どちらも事なきを得ましたが、次こそは盛大にお漏らししそうなので、今のうちから膀胱を強化するとともに、勉強しておくことを心に決めました。
運用を行う時に、何か設定を変える前にとりあえず現状把握や作業計画立てるために/etcの中の設定ファイルやログを閲覧することは多いと思う。僕はvim大好きなのでいつもvimを使ってしまうのだが、「vim /etc/httpd/conf/httpd.conf」とかだとこれは編集前提でファイルを閲覧することになるためよくない(らしい)。:w 押さないでファイル閉じるときは :q! しとけばオールオッケーじゃん!自動でスワップファイルも作ってくれるしさ!とか思ってたけど、大事なファイルを触るときのvimのコマンドの使い方知ってるか知らないかよりも、大事なファイル触るときの僕の心持というか責任感のほうが問題なんだなぁ、ということを自らの膀胱を二度も危険な目に合わすことによって気づいた。
という訳で、安全に非破壊的にファイルを見ることのできるコマンドをまとめたので覚書。
cat
見たいファイルを引数として渡すことで、標準出力にそのファイル内容をベタ出力できる。ベタ出力なので、puttyなどの便利なリモートコンソールを使わないで画面スクロールできない環境だと、一部流れる場合がある。
以下独断と偏見で選んだ便利オプションたち。
オプション | 意味 |
---|---|
-n | 全ての行頭に行数をつける |
-b | 空白行以外の行頭に行数をつける |
-E | 各行末に"$"をつける |
-T | tabを"^I"と出力する |
more
ファイルの内容を1画面ごとに表示する。catと違って画面が流れることがない。
オプション | 意味 |
---|---|
-行数 | 1画面ごとに表示する行数を指定する |
+行数 | 表示開始行を指定する |
ファイル表示中はvimのようにファイル表示モードになり、そこでもコマンドが使える。
enter | 次の行を表示する |
space | 次の画面を表示する |
b | 1つ前の画面を表示する、bの前に数字をつけるとその数字分前の画面に戻れる |
f | 1つ次の画面を表示する、fの前に数字をつけるとその数字分次の画面に戻れる |
/パターン | パターンを検索する |
q | 終了 |
less
moreと同じくベタ出力でなくファイルを閲覧することができる。moreとの違いは画面ごとのカーソル移動ではなく行ごとになる。moreはenterで1行ごとの表示が可能だが、バックスクロールはできない。
オプション | 意味 |
---|---|
-N | 行頭に行数をつける |
-n | 行数計算をしない。サイズの大きいファイルの場合は動作が捗るらしいけどホントかよ。心なしか早い気もするけど、そんなに大きいサイズのファイルがないためほぼ未確認。 |
-M | プロンプトに常にファイルの現在行のパーセンテージと行数を表示する。 |
moreと同じく、表示モードでコマンドが使用できる。
カーソルキー | 前後に移動 |
数字 | 指定行に移動 |
R | ファイルを読み直して再表示 |
q | 終了 |
head
cat,less,moreは基本ファイルの内容全部が見れるようになっているが、headの場合はファイルの先頭からデフォルト10行読み込みができる。もちろんオプションで指定行分読むことも可能。
オプション | 意味 |
---|---|
-n数字 | 先頭から指定行分読み込み |
-c数字 | 先頭から指定バイト分表示 |
tail
headと同じ感じでファイルの末尾10行がデフォルトで読める。何かアプリを動かしてるときは-fで逐次読み込みがもの凄く便利。ログ監視ができる。吉沢明歩と同じくらいにお世話になってる。
オプション | 意味 |
---|---|
-n数字 | 末尾から指定行分読み込み |
-c数字 | 末尾から指定バイト分表示 |
-f | ファイルを逐次読み込み。追加された内容を随時追記していく |
あとhttp://x68000.q-e-d.net/~68user/unix/pickup?tailで紹介されてるこのワンライナーのコマンドが面白い
% tail -f file1.log | sed 's/^/file1.log:/' & tail -f file2.log | sed 's/^/file2.log:/'
file1.log: ...(file1.log の追加行)...
file2.log: ...(file2.log の追加行)...
file1.log: ...(file1.log の追加行)...
おまけ
watch
監視関連で1つ。例えばロックファイルの生成を確認するとき1秒毎にlsしたいとかってときにwatchがあると便利。指定秒数ごとに指定されたコマンドを実行する。
watch -n 1 "ls"
これで1秒毎にlsができる。クオートの中にコマンドを指定すれば良い。