Linux標準教科書 第5章(v304対応)
基本的なコマンド2
5.1 ファイルのタイムスタンプの変更( touch )
ファイルにはタイムスタンプ(最終更新日)が必ず存在します。タイムスタンプは ls -l オプションを付けることで確認出来ます。ファイルが存在しない場合、 touch コマンドは中身が空である 0 バイトのファイルを作成します。-t はファイルの変更時刻をしてするオプションです。
実習:ファイルのタイムスタンプの変更と確認
テスト用のファイルを作成して、作成したファイルのタイムスタンプを変更してみましょう。
$ touch hosts.bak
$ ls -l hosts.bak
-rw-rw-r– 1 vagrant vagrant 0 12月 13 13:00 hosts.bak
$ touch -t 198201160000 hosts.bak
$ ls -l hosts.bak
-rw-rw-r– 1 vagrant vagrant 0 1月 16 1982 hosts.bak
-t はファイルの更新時刻を指定するオプションです。時間は [[CC]YY]MMDDhhmm[.SS] 形式([] 内は省略可) MMは月,DDは日,HHは時,mmは分,CCは西暦の上2けた,YYは西暦の下2けた,ssは秒を表すで指定します。これで、ファイルの最終更新時刻が変わったことが確認できます。
実習:touch コマンドによるファイル作成
$ ls -l touched-file
$ ls: touched-file にアクセスできません: そのようなファイルやディレクトリはありません
$ touch touched-file
$ ls -l touched-file
-rw-rw-r– 1 vagrant vagrant 0 12月 13 13:07 touched-file
ファイルが作成されました。ファイルの中身は空なので、サイズが 0 バイトになっています。
5.2 ファイルの一部の取得(head, tail)
ファイルの先頭や末尾など一部分のみを見せる場合は headコマンドや tailコマンドが使えます。
5.2.1 head
head はファイルの先頭部分を標準出力します。オプションを付けない場合は先頭から10行を標準出力します。
3とも、FILE というファイルの先頭10行を表示すます。
実行例
$ head FILE FILE の先頭 10 行を表示
$ cat FILE | head - 標準入力からの内容のうち先頭 10 行表示
$ cat FILE | head 標準入力からの内容のうち先頭 10 行表示
$ cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
上記 /etc/passwd はかなりの行数があります。パイプラインと -n オプションを使って先頭から5行を出力します。
$ cat -n /etc/passwd | head -n 5
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5.2.2 tail
tail はファイルの終わりの部分を標準出力します。オプションを付けない場合は先頭から10行を標準出力します。
$ cat -n /etc/passwd | tail -n 5
21 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
22 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
23 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
24 puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin
25 vboxadd:x:998:1::/var/run/vboxadd:/bin/false
3とも、FILE というファイルの末尾10行を表示します。
$ tail FILE
$ cat FILE | tail –
$ cat FILE | tail
5.2.3 特別なオプション -f
tail は本来ファイルの終わり部分を表示するコマンドです。ファイルによってはその終わり部分が随時変わる事があります。tail には -f というオプションが存在します。変更をリアルタイムでモニタする事が可能です。-f オプションはよく使いますので覚えましょう。
実習:tail コマンドの実行
テスト用のファイルを作成します。それに対して tail コマンドを実行して見ましょう。
$ man less > ~/manual-less
$ tail 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 458: 04 Apr 2013 LESS(1)
実習:tail -f コマンドの実行
最後に-f オプションを付けてファイルを開いてみましょう。
1. 作成した manual-less を tail -f コマンドで開きます。
$ tail -f manual-less
(略)
Version 358: 08 Jul 2000 LESS(1)
2. tail コマンドに-f オプションを付けたため、ファイルの終わり部分が標準出力されますが、シェルに制御が戻りません。
3.「アプリケーション→システム→端末」をクリックして端末をもう一つ開いてください。
4. 新しい端末で以下のようにコマンドを実行します。
$ echo ‘HelloLinux’ >> manual-less
5. manual-less ファイルにデータが追加されます。
$ tail -f manual-less
新しい端末から入力した’HelloLinux’という文字列が出力されています。tail -f によるファイルの読み 込みは「Ctrl」C キーを押して処理を中断するまで継続されます。
tail -f はこの実習から分かるように、ファイルを動的に読み込むことができます。Web サーバー のアクセスログやエラーログを見る場合に便利なコマンドです。
5.3 テキストファイルのソート( sort )
5.3.1 ファイルの準備
sort の機能を確認するため、サンプルとなるファイルを作成します。
$ cat > score
yoshiyuki kawazu 85
keiichi oka 70
toru minemura 100
(Control + d を押す)
$
5.3.2 sort の実行
実習:sort コマンドの実行
オプションを付けない場合は各行の1文字目をアルファベット順( k → t → y )でソートされます。
$ sort score
keiichi oka 70
toru minemura 100
yoshiyuki kawazu 85
実習: -r オプションを付けた逆順によるソート
アルファベットの逆順( y → t → k )にソートされます。
$ sort -r score
yoshiyuki kawazu 85
toru minemura 100
keiichi oka 70
5.3.3 n 列目のデータソート( -k )
実習: -k オプションを付けたソート
2列目の名字を基準としてソートされます( k → m → o)
$ sort -k 2 score
yoshiyuki kawazu 85
toru minemura 100
keiichi oka 70
実習: さまざまなオプションを付けたソート
-r を指定した事で上記の逆順でソートされました( o → m → k)
$ sort -k 2 -r score
keiichi oka 70
toru minemura 100
yoshiyuki kawazu 85
5.3.4 数値式でのソート
得点の列(3列目)を鍵としてソート
$ sort -k 3 score
toru minemura 100
keiichi oka 70
yoshiyuki kawazu 85
大きい順で並ぶのであれば 100 85 70 になるべきですがこれは3つの数字が「文字として」認識されているからです。これを辞書式ソートと行って、文字を辞書に出てくる順にソート出来ます。3列目は得点=数値です。これに対して、数値としてソートするのを数値式ソートといい、sort に -n オプションを付ける事で実行出来ます。
実習: 数値式ソートの実行
$ sort -k 3 -n score
keiichi oka 70
yoshiyuki kawazu 85
toru minemura 100
実習: 数値式ソートの実行(逆順)
$ sort -k 3 -n -r score
toru minemura 100
yoshiyuki kawazu 85
keiichi oka 70
5.4 行の重複の消去(uniq )
uniq コマンドを使う事で直前の行と同じ内容があった場合、対象行を出力しません。連続している同じ内容の行を、1行にまとめる事が出来ます。
実習: uniq 確認用ファイルの作成
$ cat > uniq-sample
AAA
BBB
AAA
CCC
CCC
DDD
$ cat uniq-sample
AAA
BBB
AAA
CCC
CCC
実習: uniq コマンドの実行
$ uniq uniq-sample
AAA
BBB
AAA
CCC
重複して記述されていた文字列 CCC が1行にまとめられました。このように uniq コマンドを使う事で全データから重複しない要素だけをピックアップする事ができます。AAA は2行ありますが、結果はそのまま出力されています。これは、AAA の行は連続していないために、uniq の処理対象にならないためです。完全に重複を消すには sort コマンドと組み合わせます。-c で何個重複しているか表示できます。
$ sort uniq-sample | uniq
AAA
BBB
CCC
$ sort uniq-sample | uniq -c
2 AAA
1 BBB
2 CCC
5.5 文字列の置き換え( tr )
tr コマンドは文字を文字毎に別の文字に置き換えることができます。置き換える元のデータは標 準入力からのデータを対象にします。実行例で動きを説明しましょう。
実行例
$ cat FILE | tr abc ABC
この例では以下のようなことを行ないます。
• cat コマンドで FILE を開く。
• tr コマンドで a,b,c をそれぞれ A,B,C に置き換える。
実習: tr コマンドによる置き換え
$ cat > translate
Android
iPhone
Windows Phone
(Control + c で終了)
実行
$ cat translate | tr on ON
ANdrOid
iPhONe
WiNdOws PhONe
文字毎に指定した文字を別の文字に置き換えます。o と n の文字が、大文字の O と N に置き換えられます。
tr の結果をリダイレクトを使ったファイル出力。ファイル translate には変更が記録されず、tr の実行結果はファイル translate2 にファイル出力されます。
$ cat translate | tr on ON > translate2
$ cat translate2
ANdrOid
iPhONe
WiNdOws PhONe
5.6 ファイルの比較( diff )
Linuxにはファイルを比較するコマンドがあります。主に使われる用途として、変更の有無を調べる場合に用いられます。diff の結果は標準出力されますが、リダイレクトすればファイルに出力する事が出来ます。
実習: diff コマンドの実行
file1 と file2 を作成します。ファイルが出来たらファイルを比較して見ましょう。
$ 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 2023-05-23 17:49:30.000000000 +0900
+++ file2 2023-05-23 17:49:52.000000000 +0900
@@ -1 +1,2 @@
test text
+new line
diff -c コマンドによる比較
$ diff -c file1 file2
*** file1 2018-12-14 08:14:45.725801086 +0100
— file2 2018-12-14 08:15:43.058452158 +0100
***************
*** 1 ****
— 1,2 —-
test text
+ new line
オプションを付けずに diff コマンドを実行した場合は、異なる部分を標準出力します。今回紹介 したオプションを付けて diff コマンドを実行した場合、ファイルの更新時刻を含めたより多くの差 分情報が表示されます。
$ echo “overwrite text” > file2
$ echo “new line” >> file2
$ diff file1 file2
1c1,2
test text —
> overwrite text
> new line
diff -u コマンドによる比較
$ diff -u file1 file2
— file1 2018-12-14 08:14:45.725801086 +0100
+++ file2 2018-12-14 08:35:51.821512010 +0100
@@ -1 +1,2 @@
-test text
+overwrite text
+new line
diff -u コマンドによる比較は、削除された行の頭にマイナス記号、追加された行にプラス記号が付 加されて標準出力されます。標準出力の結果から、file1 と file2 の共通していた文字列である「test text」が削除され、新たに「overwrite test」と「new line」という行が差分追加されているという ことがわかります。オプション-u は文字列の増減が激しい、文書やプログラムのソースコードを比 較する場合に有用であるといえます。
5.7 章末テスト (解答は下記へ)
(1) sort コマンドの実行結果となるように、適切なオプションを付けなさい。
$ sort ( ) price
Digital Camera 9800
32-inch TV 49800
Blue-ray Recorder 59800
(2) uniq-sample というファイルに対して uniq コマンドを実行した時の実行結果を答えなさい。
$ cat > uniq-sample
red
red
blue
red
blue
(3) file1 と file2 の内容の違いを比較するコマンドを記述しなさい。
(4) 以下のコマンドを実行したところ、何も結果が表示されずコマンド待ち状態になりました。何が考えられるのか答えなさい。
$ diff test1 test2
$
(5) パス /etc の ls コマンドの実行結果が保存されたファイル ls-etc の終わり8行分を表示する場合のコマンドを記述しなさい。
$ ls /etc > ls-etc
$ ls ls-etc
ls-etc
$ cat ls-etc
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
GREP_COLORS
NetworkManager
X11
adjtime
aliases
$ ( ) ls-etc
テキストと問題集の購入は下記の画像をクリックして下さい。
章末テスト解答
(1) -k 3 -n
(2)
$ uniq uniq-sample
red
blue
red
blue
(3) diff
(4) 差分はない
(5) ※お使いの環境によって表示が違います。
$ tail -n 8 ls-etc
virc
wgetrc
wpa_supplicant
xdg
xinetd.d
yum
yum.conf
yum.repos.d
$ cat -n ls-etc | tail -n 8
176 virc
177 wgetrc
178 wpa_supplicant
179 xdg
180 xinetd.d
181 yum
182 yum.conf
183 yum.repos.d