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 によるファイルの読み 込みは「CtrlC キーを押して処理を中断するまで継続されます。

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

linux標準教科書より抜粋

テキストと問題集の購入は下記の画像をクリックして下さい。

認定テキストKindle版はこちらから

問題集Kindle版はこちらから

章末テスト解答

(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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください