パスワードとパスワードファイル

パスワードとパスワードファイル

 グループの定義は/etc/groupファイルに、ユーザの定義は/etc/passwdファイルに記述されている。ユーザを利用するにはパスワードが必要でパスワードは/etc/shadowファイルに暗号化されて記録されている。パスワードの変更は passwd コマンドを使って行う.

パスワードファイル ( /etc/passwd )

 ユーザの情報は/etc/passwdファイルに保存され、1行に1ユーザの情報をコロン ( : ) で区切って記述する。パスワードファイルに登録された1ユーザの内容は次のようになる。

account:password:UID:GID:GECOS:dirextory:shell
パスワードファイルの内容
項目 内容
account そのシステムでのユーザ名。大文字を含まないようにする。
password 以前はユーザの暗号されたパスワードで現在は'X'である。
UID ユーザID
GID ユーザが所属するプライマリグループID番号
GECOS ユーザの名前、またはコメントのフィールド
directory ユーザのホームディレクト
shell ログイン時に起動されるユーザのコマンドインタプリタ

GECOS = General Electric Comprehensive Operating System

 従来はパスワードファイルに暗号化されたパスワードを記述していたが、多くのディストリビューションはセキュリティを考慮してシャドウファイルにパスワードを記述している。

 パスワードファイルはエディタで直接編集するべきではない。useradd コマンドなどで操作することが推奨されている。

グループファイル ( /etc/group )

 グループの情報では/etc/groupファイルに保存され、1行に1グループの情報を : で区切って記述する。グループファイルに登録された1つのグループの内容は次のようになる。

group_name:password:GID:user_list
グループファイルの内容
項目 内容
group_name グループの名前
password 以前は暗号化されたグループのパスワード、またはパスワードが不要なら空欄
GID グループID
user_list グループに所属するユーザー名のリスト。それぞれのユーザ名はコンマで区切られる。

 グループファイルはエディタで直接編集するべきではない。groupadd コマンドなどを使って操作することが推奨される。

パスワード

 ユーザの権限を使うにはユーザ名とパスワードを使って認証する。ユーザのパスワードを登録、変更するにはpasswd コマンドを使う。また、パスワードの登録にはパスワードが必要になるので、初めてパスワードを登録するにはシステム管理のrootユーザ ( スーバーユーザ ) である必要がある。

passwd [ユーザ名]

シャドウファイル ( /etc/shadow )

 ユーザのパスワードはパスワードファイルではなく、シャドウファイル ( /etc/shadow ) に保存される。シャドウファイルに登録された1つのユーザの内容は次のようになる。

account:passwprd:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
シャドウファイルの内容
項目 内容
account ユーザ名
password 暗号化されたパスワード
last_changed 1970年1月1日から、最後にパスワードが変更された日までの日数
may_be_changed パスワードが変更可能となるまでの日数
must_be_changed パスワードを変更しなくてはならなくなる日までの日数
warned パスワード有効期限が来る前に、ユーザが警告を受ける日数
expires パスワード有効期限が過ぎ、アカウントが使用不能になるまでの日数
disabled 1970年1月1日から、アカウントが使用不能になるまでの日数
reserved 予約フィールド

シャドウファイルはエディタで直接編集するべきではない。日付に使われている基準の1970年1月1日はLinuxシステムが基準としている時間である。

グループとユーザ

グループとユーザ

 Linuxを利用するにはユーザアカウントが必要である。これはログインしたユーザがlinuxというシステムの利用権限を持っているからである。グループを利用すれば複数のユーザを束ねることができる。

 グループとユーザを適切に設定することで、ファイルやディレクトリ、任意のプログラムやシェルスクリプトなどを必要なユーザにのみ参照、編集、実行する権限を与えることができる。

 グループとユーザを作成、変更、削除するコマンドは管理コマンドなので、管理者であるrootユーザで実行する必要がある。

ユーザ

 メモリやファイルなどの様々な資源を利用するために、ユーザという最小単位で権限を定義できる。

 インストール時から用意されているユーザに加えて、システム管理者が必要に応じてユーザを定義できる。ユーザの定義は/etc/passwdファイルに記述する。

 Linuxでは、/etc/passwdファイルに記述する代わりに、 useradd コマンドで新しいユーザを追加し、usermod コマンドでユーザの定義をj変更し、userdel コマンドでユーザを削除することが推奨されている。

ユーザの作成

 新しくユーザを作るには、useradd コマンドを使う。ユーザには数字であるユーザIDを割り振る。作成したユーザをログインユーザとして使用する場合は passwd コマンドにてパスワードを登録する必要がある。

$ useradd ユーザ名

オプション

-c コメント
コメント ( 文字列 ) を指定する。

-g グループ名
プライマリグループを指定する。グループ名は/etc/groupファイルで定義したグループである。

-G グループ名
補助グループを指定する。

-s 
シェルを指定する。デフォルトで/bin/bashが指定されているディストリビューションが多く、ログインしないユーザはonloginを指定するなどする。

-u ユーザID
ユーザID番号を指定する

ユーザアカウントの変更

 ユーザのアカウントを変更するにはusermodコマンドを使う。

$ usermod ユーザ名

オプション

-c コメント
コメント ( 文字列 ) を変更する。

-g グループ名
プライマリグループを変更する。グループ名は/etc/groupファイルで定義したグループである。

-G グループ名
補助グループを変更する。

-l 
既存のユーザ名を変更する。

-u ユーザID
ユーザID番号を変更する

ユーザの削除

 ユーザを削除するには、userdel コマンドを使う。

$ userdel ユーザ名

オプション

-r
ホームディレクトリを削除する。

グループ

 複数のユーザの権限をまとめて扱うためにグループを使う。ユーザは必ず1つ以上のグループbに所属していて、主に所属するグループをプライマリグループと呼ぶ。

 最初から用意されているグループに加えて、システム管理者が必要に応じてグループを定義できる。グループの定義は/etc/groupファイルに記述する。

 Linuxではetc/groupファイルをエディタで直接編集する代わりに、groupadd コマンドで新しグループを追加し、groupemod コマンドでグループの定義を変更し、groupedel コマンドでグループを削除することが推奨されている。

グループの作成

 新しくグループを着くには groupadd コマンドを使う。グループには数字のグループIDを割り振る。

$ groupadd グループ名

オプション

-g グループID番号
グループId番号を指定する。

グループの登録情報の変更

 グループの定義を変更するには、groupmod コマンドを使う。

$ groupmod [-g gid] [-n new0group-name] 変更対象のグループ

オプション

-n
既存のグループ名を変更する場合に指定する。

-g
既存のグループIDを変更する。100未満のグループIDはシステムで使われているため、指定することはできない。

実行例

$ groupmod -n penguin dolphin
( dolphin グループを penguin グループに名前変更 )

$ groupmod -g 777 penguin
( penguin グループIDを777に変更 )

グループを削除

 グループを削除するには、groupdel コマンドを使う。 groupdel コマンドでは登録されているグループの情報を削除する。ユーザが所属していないグループのみ削除することができる。

$ groupdel グループ名

置換と検索

置換と検索

 テキストファイルの文字列を検索するコマンドを使うと、素早く目的の位置に移動することができる。また、置換コマンドを使えば文章中の文字列を探して、別の文字列に置き換えることも素早く行うことができる。

コマンド 内容
/検索文字列 文字列の検索
n 上方向へ再検索
N 下方向へ再検索
:対象の行/s検索文字列/置換文字列/オプション 文字列を置換する

文字列の検索

 テキストの中から目的の文字列のカーソルへ移動するためには、/ コマンドを用いる。/ の後に検索したい文字列を続けて入力する。

/ 文字列

ファイルの中に同じ文字列が複数存在する場合、n コマンドまたは N コマンドで繰り返し探し出せる。n キーを押すと1つ次の文字列を再検索し、N キーは1つ前の文字列を再検索する。

 n キーまたは N キーは押した分だけ再検索される。

文字列の置換

 vi コマンドでは文字の置換を行うこともできる。

:対象の行 s/ 検索文字列 / 置換文字列 / オプション
コマンド 内容
:ns/old/new n行目の最初の old を new に置換して終了
:ns/old/new/g n行目の全ての old を new に置換して終了
:%s/old/newg ファイル全体の検索文字語句を置換する
:%s/old/new/gc 置換の度に確認を求める

 対象の行を省略すると現在カーソルがある行だけが置換対象になる。オプション g を指定すると1行にある複数の検索文字列を置換する。( g を指定しないと行ごとに1回だけ置換をする )

実行例

vi コマンドでサンプルファイル ( vireplace.txt ) を事前に準備する

$ cat vireplace.txt
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon

vi コマンドでファイルを開く

$ vi vireplace.txt

1行目のbananをBANANAに置換する

:1s/banana/BANANA/g

実行結果 1行目

lemon orange BANANA melon lemon

次にorangeをORANGEに置換する。

:1s/orange/ORANGE/

実行結果 1行目

lemon ORANGE BANANA melon lemon
次は g オプションの有無での動作の違いを確認する。

2行目のorangeをORANGEに置換する。 ( g オプション有り )

:2s/orange/ORANGE/g

実行結果 2行目

ORANGE banana melon lemon ORANGE

g オプションをつけた場合指定した行にある全ての文字列を別の文字列に置換する。

次に3行目の banana を BANANA に置換する。 ( g オプション無し )

:3s/banana/BANANA

実行結果 3行目

BANANA melon lemon orange banana

g オプションを付けなかった場合、指定した行にある最初の該当文字のみ、別の文字列に置換する。

ファイル全体の文字列置換

 ファイル全体の melon を *MELON* に置換する

:%s/melon/*MELON*/g

実行結果

lemon ORANGE BANANA *MELON* lemon
ORANGE banana *MELON* lemon ORANGE
BANANA *MELON* lemon orange banana
*MELON* lemon orange banana *MELON*
lemon orange banana *MELON* lemon
orange banana *MELON* lemon orange
banana *MELON* lemon orange banana
*MELON* lemon orange banana *MELON*

 行数ではなく % を指定した場合、置換範囲はファイル全体を検索範囲とする。ファイル全体の中にある melon という文字列を *MELON* に置換できた。

確認しながらファイル全体を文字列置換

 一括置換は非常に便利だが、時には確認しながら置換したいケースも考えられる。その場合は gc オプションを用いる。

 ファイル全体の lemon を @LEMON@ に確認をしながら置換する。

:%s/lemon/@LEMON@/gc

実行すると確認メッセージが表示される。この時点ではまだ置換は実行されない。

vi 20

y を押すと置換が実行され、次の lemon を置換するか確認メッセージが表示される。

vi 21

n を入力すると文字列置換を実行しない。該当文字列が見つからなくなるまで確認メッセージが表示される。

vi 22

q を入力すると文字列置換を中止できる。

vi 23

vi エディタ

vi の基本操作

 vi はページャであり、エディタでもある。viコマンドでファイルを開いた場合はコマンドモード( viewモード )とインサートモードという2つの状態が存在する。

 コマンドモードでは、ページングによる行やページ単位の移動や、行の削除、コピー、カット、ペーストなどの編集作業を行うことが出来る。

 インサートモードでは文字入力を受け付ける。

  • ページャ:ページングを行ってくれるコマンド

  • エディタ:コンピュータ上で各種のオブジェクトを編集するソフトウェア。単にエディタという場合、テキストエディタを指すことがある。

  • テキストエディタ:テキストファイルの作成・編集・保存を行うソフトウェア。文字情報の入力、削除、コピー、貼り付け、検索、置換、整形などの機能を備えている。

ファイルを開く

$ vi [ ファイル名 ]

 ファイルを閉じるには「 ESC 」キーを押した後に、 :q と入力する。 q は quit ( 終了する ) の略である。

ファイルを保存する

 vi コマンドを使って開いたファイルを保存するには、「 ESC 」キーを押した後に、 :w と入力する。 w は write ( 書く ) の略である。ファイルに変更が書き込まれ、編集作業を継続できる。

ファイルを保存して終了する

 vi コマンドを使って、ファイルを保存した後にファイルを閉じるには、「 ESC 」キーを押し後に、 :wq と入力する。 w によって変更内容が書き込まれ q によってファイルを閉じる。

ファイルを保存せずに強制的に終了する。

 vi コマンドを使って、開いたファイルを保存せずに閉じるには 「 ESC 」キーを押した後に、 :q! と入力する。

 通常は編集済のファイルをそのまま閉じることができない。:q コマンドのあとに ! をつけることで、ファイルを保存せずに、強制的に終了できる。

実行例1 ファイルに書き込む
$ vi test.txt

空のファイルを作成し、ファイルを開く

vi 05

「 i 」を押して、「インサートモード」に切り替える。

vi 04

Apple」と入力する

vi 03

「 ESC 」キーを押してインサートモードから抜け出し、 :w コマンドを実行して変更を書き込む。

vi 07

ファイルが保存される

vi 08

実行例2 :q コマンド

インサートモードに入り 「 Orange 」 と入力する

vi 09

「 ESC 」キーでインサートモードを抜け出し、 :q コマンドでファイルを閉じようとする

vi 10

変更した内容を保存していないため、エラーが表示される。

vi 11

:q! コマンドでファイルを閉じる。

vi 12

再度ファイルを開く

$ vi test.txt 

保存していない内容は失われている。

vi13

 vi コマンドはファイルの操作や閲覧を行う「 コマンドモード 」と、ファイルの編集を行う「 インサートモード 」 を切り替えることがわかる。

インサートモードとコマンドモード

 vi エディタを起動すると、コマンドを入力するコマンドモードでファイルが開かれる。

 文字列を入力するには、i コマンド、もしくは a コマンド ( append コマンド ) でインサートモードへ切り替える。 vi コマンドはスクリーンエディタと呼ばれ、基本的にカーソルがある位置に対してコマンドを実行する。

テキストの入力

 文字列を入力するインサートモードは、コマンドでインサートモードへ切り替える必要がある。インサートモードへ切り替える方法は様々だが、ここでは、i コマンドと a コマンドについて記述する。

ファイルを作成し、ファイルを開く

$  vi text.txt

   インサートモードに切り替えて、「 test 」 と入力する。

入力結果

test

 「 ESC 」キーを押して、インサートモードを抜け出す。次に a コマンドでインサートモードに切り替え,「 TEST 」 と入力する。

入力結果

testTEST

 前の手順で入力した文字列の末尾に、今回入力した文字列が追加されたのがわかる。

 今度はカーソルの位置ではなく、行の先頭にテキストを入力する。「 ESC 」キーでインサートモードを抜け出す。

 「 I コマンド 」 でインサートモードに切り替え、「 1234 」 と入力する。

入力結果

1234testTEST

 行の先頭に文字が入力されているのがわかる。

 今度は行の末尾に文字を入力する。このままインサートモードを抜け出し、コマンドモードで a コマンドや i コマンドでインサートモードに切り替えると、前回入力した文字列の末尾(4)にカーソルが位置する。

 「 ESC 」キーを押してインサートモードを抜け出す。

 行の末尾に入力するにはコマンドモードで A コマンドを使いインサートモードに切り替える。そのまま 「 6789 」 と入力する。

入力結果

1234testTEST6789

 

カーソルの移動

カーソルの左右移動

 vi でカーソルを左へ移動するには 「 h 」 、 右へ移動するには 「 l 」 と入力する。

カーソルの上下移動

 vi でカーソルを上へ移動するには 「 k 」 、 下へ移動するには 「 j 」 と入力する。

コマンドを使った行頭への移動

 0 ( ゼロ ) コマンドを実行するとカレント行の行頭へ移動する。

コマンドを使った行頭への移動

 $ コマンドを実行するとカレント行の末尾へ移動する。

編集中の大きな移動

 vi コマンドは小さなファイルから大きなファイルまで編集できる。1画面に収まりきらない大きなファイルを編集する場合は1文字ずつ移動するのは手間がかかる。

 ページ単位で移動するコマンドや、指定の行へ移動するコマンド、目的の文字列へ移動するコマンドを使う。

サンプルファイルの用意

$ man cp > test

 test ファイルを作成し、容量の大きいファイル ( マニュアル ) の内容をリダイレクトしている。

ファイル 「 test 」 を開く

$ vi text

v 14

ページ単位の移動

 次のページへ移動するには 「 Ctrl 」 + f コマンドを実行する。

 前のページへ移動するには 「 Ctrl 」 + b コマンドを実行する。

行を指定した移動

 行を指定して移動する時は : の後に行きたい行番号を指定する。例えば10行目に移動したい時は :10 と入力する。

:10 

:1 と入力すると1行目に移動する

:1 
文書頭への移動

 gg コマンドを実行すると文書頭、つまり1行目へ移動する。

文書末への移動

   G コマンドを実行すると文書末、つまり最終行へ移動する。

様々な編集操作

 文字のカット・アンド・ペーストの機能はコマンドモードで実行する。文字をカットするコマンドと、カットした文字をペーストするコマンドを利用する。

コマンド  内容 
x 1文字削除
dd 1行削除
yy 1行コピー
nyy n行コピー
p カーソルの文字の次、または次の行にペースト
P カーソルの文字の前、または前の行にペースト
u カット、ペーストを一回取り消し ( アンドゥ )

 カット、コピーした文字はバッファと呼ばれる一時的な箱に入る。p コマンド ( paste ) を実行すると、バッファに保存された文字を取り出すことができる。

編集の取り消し(アンドゥ)

 テキスト編集で何か失敗をした時に、元に戻したい場合がある。u ( undo ) コマンドを実行すると全ての編集操作について、それを取り消すことができる。

基本的なコマンド2 ( uniq, diff )

行の重複の消去( uniq )

 uniqコマンドを使うことで直前の行と同じ内容があった場合、対象行を出力しない。連続している内容の行を、1行にまとめることができる。

$ uniq [ ファイル名 ]
サンプルファイルの作成
$  cat > uniq-sample
AAA
BBB
AAA
CCC
CCC
DDD
( Ctrl + D で終了)
実行例
$ uniq uniq-sample
AAA
BBB
AAA
CCC
DDD

 uniqの実行により、重複して記述されていた文字列"CCC"が1行にまとめられた。このコマンドを使うことで、全データから重複していない要素だけをピックアップすることができる。

 AAAが2つ表示されているのは、AAAは連続して入力されていないからである。この場合はuniqコマンドの処理対象にならない。

文字列の置き換え( tr )

 tr コマンドを使うことで、標準入力からのデータを文字ごとに置き換える( TRanslate )ことができる。

$ tr 文字列1 文字列2

 tr コマンドは文字を文字ごとに別の文字に置き換えることができる。置き換える元のデータは標準入力からのデータを対象にする。

実行例1
$ cat FILE | tr abc ABC

 このコマンドでは以下の2つの処理が行われる。

  • cat コマンドによって、FILE を開く

* tr コマンドでa,b,c をそれぞれ A,B,C に置き換える

実行例2 サンプルファイルを作成する
$ cat > translate
Android
iPhone
Windows Phone
( Ctrl + D で終了 )
tr コマンドを実行する
$ cat translate | tr on ON
ANdrOid
iPhONe
WiNdOws PhONe

 oがOに、nがNに置き換わっていることがわかる。

 tr コマンドの結果は標準出力されるが、リダイレクトすればファイルに出力することもできる。

$ cat translate | tr on ON > translate2
$ cat translate2
ANdrOid
iPhONe
WiNdOws PhONe

 ファイル translate には変更が記録されず、tr の実行結果はファイル translate2 ファイルに出力されている。

ファイルの比較( diff )

 Linuxにはファイルを比較するコマンドが存在する。主に使われる用途として、変更の有無を調べる際に用いられる。diff の結果は標準出力されるが、リダイレクトすればファイルに出力することもできる。

$ diff [ オプション ] [ ファイル1 ] [ ファイル2 ]
オプション
-c
context diff 形式で差分を出力する

-u
unified diff 形式で差分を出力する
実行例1
$ diff hoge1 hoge2
$ diff  -c hoge1 hoge2
$ diff  -u hoge1 hoge2
実行例2 サンプルファイルを作成する。
$ echo "test text" > file1
$ echo "test text" > file2
$ echo "new line" >> file2
diff コマンドを実行
$ diff file1 file2
1a2
> new line
diff -u コマンドによる比較
$ diff -u file1 file2
--- file1   2021-01-21 14:25:57.000000000 +0900
+++ file2   2021-01-21 14:26:10.000000000 +0900
@@ -1 +1,2 @@
 test text
+new line
diff -c コマンドによる比較
$ diff -c file1 file2
*** file1   2021-01-21 14:25:57.000000000 +0900
--- file2   2021-01-21 14:26:10.000000000 +0900
***************
*** 1 ****
--- 1,2 ----
  test text
+ new line

オプションを付けずにdiff コマンドを実行した場合は、異なる部分を標準出力する。

実行例3 file2 の内容を別の文字列で上書きしてdiff コマンドを実行する
$ echo "overrite text" > file2
( file2 を別の文字列で上書き )
$ echo "new line" >> file2

 これで、file1とfile2の共通点がなくなった。ここでdiffコマンドを実行してみる。

$ diff file1 file2 
1c1,2
< test text
---
> overrite text
> new line

 「 3つの差分がある 」と表示されているが少しわかりにくい。なので、今度はdiff -u コマンドを実行してみる。

$ diff -u file1 file2
--- file1   2021-01-21 14:25:57.000000000 +0900
+++ file2   2021-01-21 14:36:54.000000000 +0900
@@ -1 +1,2 @@
-test text
+overrite text
+new line

 diff -u コマンドによる比較は、削除された行の頭にマイナス記号、追加された行にプラス記号が付与されて標準出力される。

 "test text"という文字列が削除され、"overwride text"と"new line"が追加されたことがわかる。-uオプションは文字列の増減が激しい、文書やプログラムのソースコードを比較する場合に有用である。

テキストファイルのソート( sort )

 テキストファイルの中身をソートするには sort コマンドが使える。オプションでどのような順序でソートするのか指定することができる  

 ※ソート:特定の規則に従ってデータを並びかえること

$ sor [ オプション ] [ ファイル名 ]

オプション

-r
逆順でソートする

-k n
n列目のデータをソートする

-n
数値としてソートする
ファイルの準備

 サンプルとなるファイルを作成する。三人の名前と数値を用いて sort コマンドとオプションの機能を確認する。

$ cat > score
yoshinori kawazu 85
keiichi oka 70
toru minemura 100
( Ctrl + c で終了する )

 ファイルを作成したので、内容を確認する

$ cat score
yoshinori kawazu 85
keiichi oka 70
toru minemura 100

 入力した内容がそのままファイルに書き込まれている。sortコマンドの機能を確認するために、このファイルをソートする。

$ sort score  
keiichi oka 70
toru minemura 100
yoshinori kawazu 85

 オプションを付けない場合は各行の1文字目のアルファベット順にソートされる( K → T → Y )。

-r オプション
$ sort -r score
yoshinori kawazu 85
toru minemura 100
keiichi oka 70

 アルファベットの逆順でソートされている( Y → T → K )。

n列目のデータソート ( -k )

 例では、1文字目を鍵としてソートを行った。これは「名前でソートしている」のと同義である。

 名前ではなく、名字でソートをしたい場合は -k オプションを利用する。 -k オプションをつけることでソートの鍵として利用する列の番号を指定することができる。

$sort -k 2 score
yoshinori kawazu 85
toru minemura 100
keiichi oka 70

 2列目のデータ(名字)を基準にソートされている( K → M → O )。

数値式でのソート

 今度は三列目の得点でソートしてみる。

$ sort -k 3 score
toru minemura 100
keiichi oka 70
yoshinori kawazu 85

 並び順がおかしくなっている。大きい順に並ぶなら 100→85→70 になるはずで、小さい順になるなら 70→85→100 になる。しかし、今回はそのどちらでもない。

 これは、3つの数値が「文字」として認識されてしまっているのが原因である。sort は1文字目しか見ないため、今回のコマンドだと3列目のデータの1文字目を基準してソートする( 1→7→8 )。

 これを辞書式ソートといい、文字を辞書に出てくる順にソートする。基準にするデータがアルファベットであれば問題ないが、得点などの数値をソートした場合には不適切である。

 これに対して数値でソートすることを数値式ソートといい、 sort に-n オプションをつけることで実行できる。

$  sort -n -k 3 score
keiichi oka 70
yoshinori kawazu 85
toru minemura 100

 特典が低い順でソートされた。

オプションに -r を加える。

$ sort -n -r -k 3 score
toru minemura 100
yoshinori kawazu 85
keiichi oka 70

-r を付与することで、得点の高い順でソートされた。(逆順でソートされた)

基本的なコマンド( touch, head, tail )

ファイルのタイムスタンプの変更( touch )

 ファイルにはタイムスタンプ(最終更新日)が必ず存在する。タイムスタンプは ls コマンドの -l オプションをつけることで確認できる。

 touchコマンドはその最終更新時間を変更するコマンドである。

$ touch [ オプション ] [ ファイル名 ]

 touchコマンドを実行すると、ファイルのタイムスタンプが現在日時に変更される。なお、オプションにより、新しいタイムスタンプとなる日時を指定することもできる。

 ちなみに、ファイルが存在しない場合、touchコマンドは中身が空であるバイト0のファイルを作成する。

オプション

-t

 -t はファイルの更新時間をするオプションである。時間は[[CC]YY]MMDDhhmm[.SS]形式([]内が省略可)で指定する。これで、ファイルの最終更新時刻が変わったことが確認できる。

 touchコマンドで指定したファイルが存在しない場合、空のファイルを作成する。

[[CC]YY]MMDDhhmm[.SS]形式の意味

  • CC:年の最初の 2 桁 (世紀)。

  • YY:年の後半の 2 桁。 CC を指定せずに YY だけを指定した場合、YY の値が 69 - 99 の範囲内であれば、CC 値は 19 と見なされる。 その他の場合は、20 の CC 値が使われる。

  • MM:月を表す 1 - 12 の値。

  • DD:日を表す 1 - 31 の値。

  • hh:時を表す 0 - 23 の値。

  • mm:分を表す 0 - 59 の値。

  • SS:秒を表す 0 - 59 の値。

ファイルの一部の取得( head, tail )

headコマンド

 headコマンドはファイルの先頭部分を標準出力する。

$ head [ オプション ] [ ファイル名 ]

オプション

-n 行
先頭から指定した行を標準出力する。

-c バイト
先頭から指定したバイト分を標準出力する。

 ファイル名の部分を空白、もしくはハイフン( - ) にした場合は標準入力からデータに対し処理を行う。従って、以下の三つのコマンドの実行結果は同一になる。

$ head FILE      [FIlE]の先頭10行を表示
$ cat FILE | head - 標準入力からの内容のうち先頭10行を表示
$ cat FILE | head    標準入力からの内容のうち先頭10行を表示

 オプションに行数を指定しなかった場合は先頭10行が表示される。オプションをつけることにより、表示する行数を変更できる。

tailコマンド

 tail は head の逆で、ファイルの終わりの部分を標準出力する。オプションを付けない場合は末尾の10行を標準出力する。

$ [ オプション ] [ ファイル名 ]

オプション

-n 行
末尾から指定した行を標準出力する。

-c バイト
末尾から指定したバイトを標準出力する。

 こちらも head と同様だが、ファイル名の部分を空白、もしくはハイフン( - ) にした場合は標準入力からデータに対し処理を行う。従って、以下の三つのコマンドの実行結果は同一になる。

$ tail FILE      [FILE]の末尾10行を表示
$ cat FILE | tail - 標準入力からの内容のうち末尾10行表示
$ cat FILE | tail  標準入力からの内容のうち末尾10行表示

特別なオプション -f

 tail は本来ファイルの終わりを表示するコマンドである。しかし、ファイルによってはその終わりが随時変わることがある。-f オプションは変更をリアルタイムをモニタすることが可能となる。よく用いられる目的にログファイルのモニタが挙げられる。

 システムの変更やサービスの動作などでメッセージがログに記載されると、その内容が出力される。

$ tail -f [ ファイル名 ]
tail コマンドの実行例
$ man less > ~/manual-less

テスト用のファイルを作成している。

$ tail manual-less
 Mark Nudelman
       Send bug reports or comments to <bug-less@gnu.org>
       See http://www.greenwoodsoftware.com/less/bugs.html for the latest list
       of known bugs in less.
       For more information, see the less homepage at
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)

 manual-lessファイルの末尾10行が表示される。

-n オプションの実行
$  tail -n 5 manual-less
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)

 末尾5行を標準出力している。

-fオプションの実行
$ tail -f manual-less
       Mark Nudelman
       Send bug reports or comments to <bug-less@gnu.org>
       See http://www.greenwoodsoftware.com/less/bugs.html for the latest list
       of known bugs in less.
       For more information, see the less homepage at
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)

 tailコマンドに -fオプションを付けたので、ファイルの終わりの部分が標準出力されるが、シェルに制御が戻らない。

 新しく別の端末を開き、以下のコマンドを実行する

$ echo 'Hello' >> manual-less

 すると、manual-less ファイルにデータが追加される

$ tail -f manual-less
 Mark Nudelman
       Send bug reports or comments to <bug-less@gnu.org>
       See http://www.greenwoodsoftware.com/less/bugs.html for the latest list
       of known bugs in less.
       For more information, see the less homepage at
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)
Hello

 tail -f によるファイルの読み込みは「 Ctrl」 + C キーを押し処理が中断されるまで継続される。これにより、 tail -f はファイルを動的に読み込むことができるがわかる。

 webサーバーのアクセルログやエラーログを見るのに便利なコマンドである。