Linux講座にようこそ。このページは「Linuxの使い方 - 第4章 ファイル操作のコマンド2」です。
sortコマンドはテキストファイルの内容をフィールドをキーとして昇順または、降順に並べ替えます。フィールドは1個のスペースを区切りとする文字列ですが、オプションにより変更可能です。
キーフィールドは-kオプションで指定します。「位置2」を省略しますと「位置1」以降、全てがキーとなります。また、-kオプションを省略した場合は全てのフィールドがキーになります。
オプション | 意味 |
---|---|
-b, --ignore-leading-blanks | キーフィールドの先頭のスペースを無視します。 |
-f, --ignore-case | キーフィールドの大文字と小文字を同じ文字として取り扱います。 |
-n, --numeric-sort | キーフィールドの数字文字列を数値として取り扱います。 |
-r, --reverse | 降順(大→小)に並べ替えます。 |
-t 記号, --field-separator=記号 | フィールドの区切り記号を指定します。 |
-k 位置1,位置2, --key=位置1,位置2 | 先頭のフィールドを1としたときのキーフィールドの位置を指定します。 |
-o 出力ファイルパス名, --output=出力ファイルパス名 | 出力ファイルを指定します。入力ファイルと同じファイルに出力したいときに指定するとよいでしょう。(入力ファイルと同じファイルを出力ファイルとしてリダイレクトで指定すると、ファイルの内容が壊れる可能性が有ります) |
以降の例題では入力ファイルとしてユーザ登録簿(/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: (以下省略) $
grepコマンドはテキストファイル中から指定した文字列を含む行を検索します。
「検索文字列」はシェルの解析を抑止するためにアポストロフィまたは、引用符で括ったほうがよいでしょう。
「検索文字列」中にシェルのワイルドカードと同じような特殊な意味を持つ記号を指定できます。よく使うもののみ挙げておきますと、^(アクサンシルコンフレックス)は行の先頭、$(ドル記号)は行末、.(ピリオド)は任意の1文字、[文字列](左大括弧と右大括弧で文字列を括る)は文字列中の1文字を意味します。
オプション | 意味 |
---|---|
-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 $
cutコマンドはテキストファイル中からフィールドまたは、カラム単位で文字列を切り出します。
カラムやフィールドが複数の場合は,(コンマ)で、連続の場合は-(負記号)で指定できます。また、-nと指定した場合は先頭からnまで、n-と指定した場合はnから最後までの指定になります。
オプション | 意味 |
---|---|
-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 $
dfコマンドはファイルシステムの容量情報を、duコマンドはディレクトリ単位の容量情報を表示します。
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 $
tarコマンドとcpioコマンドは複数のファイルやディレクトリを1つのファイルに連結(アーカイブ)します。tarコマンドにはgzipコマンドを使ってアーカイブファイルを圧縮・回復する機能がありますので、手軽にバックアップを取りたいという場合はtarコマンドを使うとよいでしょう。
cpioコマンドは標準入力からパス名のリストを入力して、そのファイルやディレクトリのアーカイブファイルを作成したりコピーを行いますので、findコマンドで検索した結果を使ってバックアップを取るという様な使い方もできます。
tarコマンドは-fオプションでアーカイブファイル名を指定します。また、標準入出力を使いたい場合は-(負記号)記号を指定します。
cpioコマンドでアーカイブファイルを作成する場合、出力は標準出力ですので標準出力をファイルに切り替えます。また、回復する場合はカレントディレクトリの下に回復します。
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コマンドのオプションには、次のようなものがあります。
オプション | 意味 |
---|---|
-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 $