私のコンピュータ工学の授業の中で、先生は私たちにユーザーファイルを与えました。users.txt
このファイルの行は次のとおりです。
$ head users.txt
root:x:0:0:root:/root:/bin/bash
apache:x:71:71:system user for apache2:/var/www:/bin/sh
ftp:x:73:73:system user for proftpd:/var/ftp:/bin/false
c0407115:x:1501:1000:Alberto Damiao Canelas Fraga:/home/c0407115:/bin/bash
c0407165:x:1502:1000:Alexandre Viriato Morais Magalhaes:/home/c0407165:/bin/bash
c0407110:x:1503:1000:Alvaro Manuel Figueiredo Nunes de Sousa:/home/c0407110:/bin/bash
c0307009:x:1504:1000:Ana Marta Tavares Laranjeira:/home/c0307009:/bin/bash
c0416079:x:1505:1000:Ana Rita Caetano Mourato:/home/c0416079:/bin/bash
c0407137:x:1506:1000:André Brito Coimbra:/home/c0407137:/bin/bash
c0307068:x:1507:1000:André Filipe Rios da Fonseca Alves Modesto:/home/c0307068:/bin/bash
すると先生は次のようなお願いをしました。
学生以外のすべてのユーザーを一覧表示するコマンドを作成します(つまり、ログイン名がc??で始まらない)。
私の最初の方法は次のとおりです。
$ cat users.txt | grep [^c]*
grep: figures: Is a directory
grep: practice: Is a directory
作業中のディレクトリ内の特定のディレクトリに関連するエラーメッセージが表示されます。私のディレクトリにある現在のファイルは次のとおりです。
$ ls
archive figures practice users.txt
その後、逆方向一致オプションを使用して反対の操作を試みました。
$ cat users.txt | grep -v [c]*
$
しかし今回は何の結果も得られませんでした。これがうまくいかないのはなぜですか?エラーメッセージが表示されるのはなぜですか。どうすればいいですか?ありがとう
答え1
... | grep [^c]*
これには、次のよう[^c]*
なファイル名パターンであるglobがあります。*.txt
その[^c]
意味は正規表現と同じです。つまり、ではなくすべての単一文字と一致しますc
。正規表現とは異なり、*
グローバルにすべての文字数と一致します。したがって、コンテンツ全体は、で始まらないすべてのファイル名と一致して拡張されますc
(例:all)archive figures practice users.txt
。
-e
or-f
オプションなしで引数のリストを指定すると、最初の引数がパターンgrep
として使用されるため、コマンドは残りのファイルarchive
でその文字列を検索します。grep
ディレクトリはデフォルトで処理されないため、これらのエラーが発生します。
grep
パターンにシェル固有の文字が含まれている場合は、パターンが変更されないように引用符で囲む必要があります。または、安全のために特殊文字がある場合は、パターンを引用してください。
正規表現としてではなく、連続した[^c]*
文字数と一致しますc
。ただし、これには長さ0の一致が含まれているため、grep '[^c]*'
すべての行が一致します。
パターンを行の先頭に固定し、少なくとも1文字を必要とするようにする必要があります。
これは宿題なので、次のコマンドを試してみて、なぜそのようなことをするのかを調べることができます。
grep c users.txt
grep -v c users.txt
grep ^c users.txt
grep -v ^c users.txt
grep '^[^c]' users.txt
grep -v '^[^c]' users.txt
([c]
justと同じですc
ので省略します。^
実際にはシェル自体に特別なものではないので、ここで参照する必要はありません。一部のパターンは他のパターンと同じかもしれません。)
答え2
無効な正規表現を使用しました。いいね:
cat ./users.txt | grep -v '^c'
以下のことなくこれを行うことができますcat
。
grep -v '^c' ./users.txt