# 第三章 GNUとUnixのコマンド
練習問題3.11
3台のホストに存在するユーザー名を重複なくリスト化しようとしています。
$ cut -d: -f1 /etc/passwd > passwd1
というコマンドを実行し、ユーザー名一覧をpasswd1ファイルに保存しました。また、別のホストで同様にpasswd2、passwd3といったファイルにユーザー名一覧を保存しました。これらのファイルを、次のようにして結合しました。
$cat passwd1 passwd2 passwd3 > users.list
users.listファイルには「root」やシステムアカウントなど、各ホストで重複するユーザー名が含まれています。そこで、重複行を1つにまとめるため、次のコマンドを実行しました。
$ mv users.list users.list.org
$ mv users.org > users.list
しかし、重複行は1つにまとまりませんでした。その理由として適切なものを選択してください。
A. catコマンドで結合する前に sortコマンドを実行しておく必要がある
B. mvコマンドの引数の指定が逆である
C. catコマンドでファイルを結合するには「>」ではなく「>>」で指定しないとファイルが上書きされてしまう。
D. uniqコマンドを実行する前にsortコマンドでソートしておく必要がある。
E. 重複行を1行にまとめるには、uniqコマンドではなくwcコマンドを使う。
(解答)D
(解説)
設問にあるようにcatコマンドファイルを結合すると、「passwd1ファイルの内容」「passwd2ファイルの内容」「passwd3ファイルの内容」の順に結合されます。uniqコマンドで重複行を1つにまとめるには、あらかじめソートしておく必要があります。gた、この状態ではソートされていません。そのため重複行がまとまらなかったのです。
$ sort users.list.org | uniq > users.list
のようにあらかじめソートしておく必要があります。
catコマンドで結合する前にソートしておいても、上記の通り結合したファイルはソートされていないため、選択肢Aは不正解です。設問の、mvコマンドは、作成したusers.listファイルのファイル名をusers.list.orgに変更するために使われているので、引数の指定が間違っているわけではありません。catコマンドによるファイルの結合は「>]で構いません。「>>」でなければならないのは次のような結合の仕方を和る場合でしょう。
$ cat passwd1 > users.list
$ cat passwd2 >> users.list
$ cat passwd3 >> users.list
wcコマンドはファイルの行数や文字数をカウントするコマンドなので、選択肢Eは不正解です。
(わからない単語解説)
- >>
コマンドの標準出力(実行結果)をファイルに追記する - cutコマンド
ファイルの各行から指定したフィールドを取り出します。「-d」オプションはフィールドの区切り文字(デリミタ)を指定する(デフォルトはタブ)設問の $ cut -d: -f1 は区切り文字(デリミタ)を「:」として1番目のフィールドを取り出す。という意味合いになります。 - catコマンド
ファイルの内容を表示するために使われる、正確には、ファイルの内容を標準出力に出力する。そのため、シェルのリダイレクトを使って複数のファイルの結合をすることもできる