Linux講座にようこそ。このページは「Linuxの使い方 - 第4章 ファイル操作のコマンド2」です。

Linuxの使い方

4. ファイル操作のコマンド2(3/5)

4.3 コマンドのご紹介2(2/4)

4.3.5 行の並べ替え(sortコマンド)

sortコマンドはテキストファイルの内容をフィールドをキーとして昇順または、降順に並べ替えます。フィールドは1個のスペースを区切りとする文字列ですが、オプションにより変更可能です。

一般形式

キーフィールドは-kオプションで指定します。「位置2」を省略しますと「位置1」以降、全てがキーとなります。また、-kオプションを省略した場合は全てのフィールドがキーになります。

$ sort -bfnr -t 記号 -k 位置1,位置2 -o 出力ファイルパス名 ファイルパス名1 ファイルパス名2 …
【表4-10】sortコマンド・オプション
オプション意味
-b, --ignore-leading-blanksキーフィールドの先頭のスペースを無視します。
-f, --ignore-caseキーフィールドの大文字と小文字を同じ文字として取り扱います。
-n, --numeric-sortキーフィールドの数字文字列を数値として取り扱います。
-r, --reverse降順(大→小)に並べ替えます。
-t 記号, --field-separator=記号フィールドの区切り記号を指定します。
-k 位置1,位置2,
--key=位置1,位置2
先頭のフィールドを1としたときのキーフィールドの位置を指定します。
-o 出力ファイルパス名,
--output=出力ファイルパス名
出力ファイルを指定します。入力ファイルと同じファイルに出力したいときに指定するとよいでしょう。(入力ファイルと同じファイルを出力ファイルとしてリダイレクトで指定すると、ファイルの内容が壊れる可能性が有ります)

実行例

passwdファイルの形式
【図4-2】passwdファイルの形式
:(コロン)が区切り記号で、7つの項目からなっています

以降の例題では入力ファイルとしてユーザ登録簿(/etc/passwd)を使用しますので、passwdファイルの形式について簡単に説明します。図4-2の例はシステム管理者(ユーザ名はroot)の登録内容です。

:(コロン)が区切り記号で、先頭からユーザ名、パスワード、ユーザID、グループID、コメント、ホームディレクトリ、ログイン時に起動するプロセスの順で記述されています。実際のパスワードはこのファイルには入っていません。

ユーザ名の小さなものから順(昇順)に並べ替えます。

$ sort -t : -k 1,1 /etc/passwd
adm:x:3:4:adm:/var/adm:
apache:x:48:48:Apache:/var/www:/bin/false
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
ftp:x:14:50:FTP User:/var/ftp:
(以下省略)
$

ユーザIDの小さなものから順(昇順)に並べ替えます。

$ sort -n -t : -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
(以下省略)
$

4.3.6 文字列の検索(grepコマンド)

grepコマンドはテキストファイル中から指定した文字列を含む行を検索します。

一般形式

「検索文字列」はシェルの解析を抑止するためにアポストロフィまたは、引用符で括ったほうがよいでしょう。

「検索文字列」中にシェルのワイルドカードと同じような特殊な意味を持つ記号を指定できます。よく使うもののみ挙げておきますと、^(アクサンシルコンフレックス)は行の先頭、$(ドル記号)は行末、.(ピリオド)は任意の1文字、[文字列](左大括弧と右大括弧で文字列を括る)は文字列中の1文字を意味します。

$ grep -cinrv --exclude=GLOB --include=GLOB 検索文字列 ファイルパス名1 ファイルパス名2 …
【表4-11】grepコマンド・オプション
オプション意味
-c, --count結果として行数のみを出力します。
--exclude=GLOBパスなしのファイル名がGLOBにマッチするファイルを処理対外にします。GLOBで指定するファイル名には、*、 ?、[]がワイルドカードとして使用できます。(ワイルドカードに付いては「4.1 ファイルやディレクトリをまとめて指定するワイルドカード」をご覧ください)
-i, --ignore-case大文字と小文字を同じ文字として取り扱います。
--include=GLOBパスなしのファイル名がGLOBにマッチするファイルのみを処理対象とします。GLOBに付いては--excludeと同じです。
-n, --line-number出力に行番号を付加します。
-R, -r,
--recursive
ファイルパス名の代わりにディレクトリパス名を指定します。ディレクトリ以下、全てのファイルを検索します。
-v, --invert-match結果として一致しなかった行を出力します。

実行例

/etc/passwdファイルから「merry」を含む行を表示します。

$ grep "merry" /etc/passwd
merry:x:1001:100:Email.merry@xxxx.com:/home/merry:/bin/bash
$

/etc/passwdファイルから行頭1文字が「a」の行を行番号を付加して表示します。

$ grep -n "^a" /etc/passwd ← ^記号は行頭を意味します
4:adm:x:3:4:adm:/var/adm: ← 先頭の「4:」は行番号です
17:apache:x:48:48:Apache:/var/www:/bin/false
$

カレントディレクトリ以下のファイルから「Fedora」を含む行を行番号を付加して表示します。ただし、「Fedora」は大文字と小文字を同じ文字として取り扱います。

$ grep 'fedora' -inr . ← .でカレントディレクトリを指定します
./ETC/issue:1:Fedora release 16 (Verne)
$

カレントディレクトリ以下のファイルで拡張子が「.html」のファイルから「grep」を含む行を表示します。

$ grep --include=*.html -r 'grep' .
./DIR1/grep_1.html:grep_1.html
./DIR1/cmdtop.html:    <li><a href="./SECTION4/section4_3.html#grep">文字列の検索(grepコマンド)</a></li>
$

カレントディレクトリ以下のファイルで拡張子が「.html」以外のファイルから「grep」を含む行を表示します。

$ grep --exclude=*.html -r 'grep' .
./grep_3html:grep_3html
./DIR1/common.css:/* grepコマンド */
./DIR1/grep_2.htm:grep_2.htm
$

4.3.7 文字列の切り出し(cutコマンド)

cutコマンドはテキストファイル中からフィールドまたは、カラム単位で文字列を切り出します。

一般形式

カラムやフィールドが複数の場合は,(コンマ)で、連続の場合は-(負記号)で指定できます。また、-nと指定した場合は先頭からnまで、n-と指定した場合はnから最後までの指定になります。

$ cut -c カラム1,カラム2,… ファイルパス名1 ファイルパス名2 …
$ cut -f フィールド1,フィールド2,… -d 記号 ファイルパス名1 ファイルパス名2 …
【表4-12】cutコマンド・オプション
オプション意味
-c, --characters=カラムカラム単位で切り出します。
-f, --fields=フィールドフィールド単位で切り出します。
-d, --delimiter=記号フィールドの区切り記号を指定します。指定しないときはタブ記号が仮定されます。

実行例

/etc/passwdファイルからホームディレクトリ情報(フィールド6)を切り出します。

$ cut -f 6 -d : /etc/passwd ← -dオプションで区切り記号を指定します
/root
/bin
/sbin
/var/adm
(以下省略)
$

/etc/passwdファイルからユーザID(フィールド3)からホームディレクトリ(フィールド6)までの連続情報を切り出します。

$ cut -f 3-6 -d : /etc/passwd
0:0:root:/root
1:1:bin:/bin
2:2:daemon:/sbin
3:4:adm:/var/adm
(以下省略)
$

meibo2ファイルから名前(カラム4~13)と犬種(カラム15~最後)を切り出します。

$ cat meibo2
001Merry     FHusky
002Kuma      MMix
003Hana      FShiba
004ken       MMix
005Taro      MBull
$
$ cut -c 4-13,15- meibo2
Merry     Husky
Kuma      Mix
Hana      Shiba
ken       Mix
Taro      Bull
$

4.3.8 ファイルシステムとディレクトリの容量表示(dfとduコマンド)

dfコマンドはファイルシステムの容量情報を、duコマンドはディレクトリ単位の容量情報を表示します。

一般形式

dfコマンドでファイルシステム名を省略した場合はマウントしてあるもの全てを対象とし、duコマンドでディレクトリパス名を省略した場合はカレントディレクトリを仮定します。

$ df -h ファイルシステム名
$ du -ahs ディレクトリパス名1 ディレクトリパス名2 …
【表4-13】dfとduコマンド・オプション
オプション意味
-h, --human-readable人間が分かりやすい単位で表示します。
-a, --all対象となるファイルやディレクトリを全て表示します。
-s, --summarize最終結果だけを1行で表示します。

実行例

現在マウント中の全ファイルシステムの情報を表示します。

$ df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda5             10317828   3787200   6006512  39% /
tmpfs                   508976       900    508076   1% /dev/shm
/dev/sda6              5162796   1073508   3827032  22% /var
/dev/sda7             30470144  12388760  16508624  43% /home
/dev/sda2              5245220   2425720   2819500  47% /mnt/win
$
$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sda5             9.9G  3.7G  5.8G  39% /
tmpfs                 498M  900K  497M   1% /dev/shm
/dev/sda6             5.0G  1.1G  3.7G  22% /var
/dev/sda7              30G   12G   16G  43% /home
/dev/sda2             5.1G  2.4G  2.7G  47% /mnt/win
$

WORKディレクトリ以下の容量を表示します。

$ du WORK
292     WORK/BKUP ← BKUPディレクトリ以下の容量(292×1024Bytes)です
320     WORK
$
$ du -h WORK
292K    WORK/BKUP
320K    WORK
$
$ du -ah WORK ← 全て表示します
96K     WORK/BKUP/file_1.xcf
192K    WORK/BKUP/merry01.xcf
292K    WORK/BKUP
16K     WORK/file_1.jpg
8.0K    WORK/merry01.jpg
320K    WORK
$
$ du -sh WORK ← 最終結果のみ表示します
320K    WORK
$

4.3.9 ファイルのバックアップ(tarコマンドとcpioコマンド)

tarコマンドとcpioコマンドは複数のファイルやディレクトリを1つのファイルに連結(アーカイブ)します。tarコマンドにはgzipコマンドを使ってアーカイブファイルを圧縮・回復する機能がありますので、手軽にバックアップを取りたいという場合はtarコマンドを使うとよいでしょう。

cpioコマンドは標準入力からパス名のリストを入力して、そのファイルやディレクトリのアーカイブファイルを作成したりコピーを行いますので、findコマンドで検索した結果を使ってバックアップを取るという様な使い方もできます。

一般形式

tarコマンドは-fオプションでアーカイブファイル名を指定します。また、標準入出力を使いたい場合は-(負記号)記号を指定します。

cpioコマンドでアーカイブファイルを作成する場合、出力は標準出力ですので標準出力をファイルに切り替えます。また、回復する場合はカレントディレクトリの下に回復します。

※ アーカイブファイルの新規作成
$ tar -cz -C ディレクトリパス名 -f アーカイブファイルパス名 ファイルパス名1 ファイルパス名2 …
※ アーカイブファイルへの追加
$ tar -rz -C ディレクトリパス名 -f アーカイブファイルパス名 ファイルパス名1 ファイルパス名2 …
※ アーカイブファイルから回復
$ tar -xz -C ディレクトリパス名 -f アーカイブファイルパス名
※ アーカイブファイルの内容表示
$ tar -tzf アーカイブファイルパス名

※ アーカイブファイルの新規作成
$ cpio -o > アーカイブファイルパス名 < パス名リスト
※ アーカイブファイルから回復
$ cpio -idm < アーカイブファイルパス名
※ ファイルのコピー
$ cpio -pdm コピー先ディレクトリパス名 < パス名リスト
※ アーカイブファイルの内容表示
$ cpio -tv < アーカイブファイルパス名

tarコマンドのオプションには、次のようなものがあります。(各オプションの-は省略できます)

【表4-14】tarコマンド・オプション
オプション意味
-c, --create新規にアーカイブファイルを作成します。
-f, --fileアーカイブファイルのパス名を指定します。
-r, --appendアーカイブファイルに追加出力します。
-x, --extract, --get アーカイブファイルから回復します。
-C, --directory指定したディレクトリにカレントディレクトリを変更してtarコマンドを実行します。
-z, --gzip, --ungzipアーカイブファイルをgzipで圧縮します。また、gzipで圧縮したアーカイブファイルから回復(ungzip)します。
-j, --bzip2アーカイブファイルをbzip2で圧縮します。また、bzip2で圧縮したアーカイブファイルから回復します。(古いバージョンではサポートしていませんので注意して下さい)
-t, --list アーカイブファイルの内容を表示します。

cpioコマンドのオプションには、次のようなものがあります。

【表4-15】cpioコマンド・オプション
オプション意味
-o, --create新規にアーカイブファイルを作成します。
-i, --extractアーカイブファイルから回復します。
-p, --pass-throughファイルのコピーを行います。
-d, --make-directories必要に応じてディレクトリを作成します。当オプションを指定しないと回復時にディレクトリを作成しません。
-m,
--preserve-modification-time
コピー元のファイルの更新日時を保持します。当オプションを指定しないと回復時にファイルの更新日時は実行時の日時になります。
-t, --listアーカイブファイルに登録されているファイル名の一覧を表示します。
-v, --verbose-tオプションが同時に指定されている場合には、lsコマンド形式の詳細情報を表示します。

実行例

tarコマンドでアーカイブファイルを作成します。

$ ls ./DEVELOP
Hello.c    ex02_1.c    ex02_2.c    ex02_3.c    include   loop.o
Hello.exe  ex02_1.exe  ex02_2.exe  ex02_3.exe  loop.c    makefile
Hello.o    ex02_1.o    ex02_2.o    ex02_3.o    loop.exe
$
$ tar -cf ~/TMP/BACKUP/bk01.tar ./DEVELOP ← DEVELOPディレクトリを含めてアーカイブファイルを作成します
$ tar -tf ~/TMP/BACKUP/bk01.tar ← アーカイブファイブの内容を表示します
./DEVELOP/
./DEVELOP/Hello.exe
./DEVELOP/ex02_3.c
./DEVELOP/ex02_3.exe
./DEVELOP/ex02_2.exe
./DEVELOP/Hello.o
./DEVELOP/loop.o
./DEVELOP/loop.c
./DEVELOP/ex02_1.c
./DEVELOP/ex02_2.c
./DEVELOP/ex02_2.o
./DEVELOP/include/
./DEVELOP/include/ex13_1.h
./DEVELOP/makefile
./DEVELOP/ex02_3.o
./DEVELOP/ex02_1.o
./DEVELOP/Hello.c
./DEVELOP/ex02_1.exe
./DEVELOP/loop.exe
$
$ cd ./DEVELOP ← DEVELOPディレクトリをカレントディレクトリに変更します
$ tar -cf ~/TMP/BACKUP/bk02.tar ./*.c ← カレントディレクトリの下の拡張子が.cのファイルのみのアーカイブファイルを作成します
$ tar -tf ~/TMP/BACKUP/bk02.tar
./Hello.c
./ex02_1.c
./ex02_2.c
./ex02_3.c
./loop.c
$

前の例題で取ったアーカイブファイル(bk02.tar)から~/RESTORE/に回復します。

$ tar -xC ~/RESTORE -f ~/TMP/BACKUP/bk02.tar ← ~/RESTOREにカレントディレクトリを変更して回復します
$ ls ~/RESTORE
Hello.c  ex02_1.c  ex02_2.c  ex02_3.c  loop.c
$
$ cd ~/RESTORE; tar -xf ~/TMP/BACKUP/bk02.tar ← こちらの方法でも同じです
$

gzipで圧縮したアーカイブファイル(bk03.tar.gz)を作り、それから回復します。

$ tar -czf ~/TMP/BACKUP/bk03.tar.gz ./*.c ← -zオプションを指定します
$ tar -tzf ~/TMP/BACKUP/bk03.tar.gz
./Hello.c
./ex02_1.c
./ex02_2.c
./ex02_3.c
./loop.c
$
$ tar -xzC ~/RESTORE -f ~/TMP/BACKUP/bk03.tar.gz ← 回復します
$ ls ~/RESTORE
Hello.c  ex02_1.c  ex02_2.c  ex02_3.c  loop.c
$

cpioコマンドでカレントディレクトリ以下のファイルで、更新日付が1日前のファイルのアーカイブファイルを作成します。

$ find . -type f -and -mtime -1 | cpio -o > ~/TMP/BACKUP/bk03.bk ← findの検索結果をcpioに渡します
27 blocks
$ cpio -vt < ~/TMP/BACKUP/bk03.bk ← アーカイブファイブの内容を表示します
-rw-r--r--   1 merry    merry         702 May 19 14:21 ex02_3.c
-rwxr-xr-x   1 merry    merry        5483 May 19 14:21 ex02_3.exe
-rw-r--r--   1 merry    merry         132 May 19 14:20 ex02_1.c
-rw-r--r--   1 merry    merry        1472 May 19 14:21 ex02_3.o
-rw-r--r--   1 merry    merry         703 May 19 14:21 ex02_1.o
-rwxr-xr-x   1 merry    merry        4820 May 19 14:21 ex02_1.exe
27 blocks
$

前の例題で作成したアーカイブファイル(bk03.bk)から~/RESTORE/に回復します。(dmオプションにより、回復するファイルの日時は元の日時になりディレクトリも作成します)

$ cd ~/RESTORE; cpio -idm < ~/TMP/BACKUP/bk03.bk
27 blocks
$ ls -l
合計 32
-rw-r--r-- 1 merry merry  132 2010-05-19 14:20 ex02_1.c
-rwxr-xr-x 1 merry merry 4820 2010-05-19 14:21 ex02_1.exe
-rw-r--r-- 1 merry merry  703 2010-05-19 14:21 ex02_1.o
-rw-r--r-- 1 merry merry  702 2010-05-19 14:21 ex02_3.c
-rwxr-xr-x 1 merry merry 5483 2010-05-19 14:21 ex02_3.exe
-rw-r--r-- 1 merry merry 1472 2010-05-19 14:21 ex02_3.o
$

~/DEVELOP/以下のファイルで、更新日付が1日前のファイルを~/RESTOREにコピーします。

$ cd ~/DEVELOP
$ find . -type f -and -mtime -1 | cpio -pdm ~/RESTORE
26 blocks
$
$ ls ~/RESTORE
ex02_1.c  ex02_1.exe  ex02_1.o  ex02_3.c  ex02_3.exe  ex02_3.o
$