grepを使用して「c」で始まらない項目を一覧表示する方法

grepを使用して「c」で始まらない項目を一覧表示する方法

私のコンピュータ工学の授業の中で、先生は私たちにユーザーファイルを与えました。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

-eor-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

関連情報