web-dev-qa-db-ja.com

複数のgrep検索/無視パターン

私は通常、次のパイプラインを使用して特定の検索文字列をgrepしますが、他の特定のパターンは無視します。

grep -Ri 64 src/install/ | grep -v \.svn | grep -v "file"| grep -v "2\.5" | grep -v "2\.6"

これは簡潔な方法で達成できますか?私はGNU grep2.5.3を使用しています。

20

フィルタリングされていない出力をgrepの単一インスタンスにパイプし、拡張正規表現を使用して、無視するものを宣言するだけです。

grep -Ri 64 src/install/ | grep -v -E '(\.svn|file|2\.5|2\.6)'

編集:複数のファイルを検索するには、

find ./src/install -type f -print |\
    grep -v -E '(\.svn|file|2\.5|2\.6)' | xargs grep -i 64

編集:ああ。複数のgrepインスタンスの使いにくい使用を停止するための簡単なトリックを追加するのを忘れました。

ps -ef | grep something | grep -v grep

それを

ps -ef | grep "[s]omething"

2番目のgrepが不要になります。

26
Rob Wells

-eオプションを使用して、複数のパターンを指定します。

grep -Ri 64 src/install/ | grep -v -e '\.svn' -e file -e '2\.5' -e '2\.6'

パターンが正規表現ではなく固定文字列であることを示す-Fフラグにも興味があるかもしれません。これで、ドットをエスケープする必要はありません。

grep -Ri 64 src/install/ | grep -vF -e .svn -e file -e 2.5 -e 2.6

「.svn」をgrepしていることに気づきました。最初の再帰的なgrepで「.svn」という名前のディレクトリをスキップしたい場合があります。私があなたなら、代わりにこれを行います:

grep -Ri 64 src/install/ --exclude-dir .svn | grep -vF -e file -e 2.5 -e 2.6
8
Flimm

grepの代わりにawkを使用できます

awk '/64/&&!/(\.svn|file|2\.[56])/' file
2
ghostdog74

ack-grep を使用すると、Perl regexpでも除外でき、すべてのVCディレクトリを回避できます。これは、ソースコードのgrepに最適です。

1

次のスクリプトは、ファイルのリストを除くすべてのファイルを削除します。

echo cleanup_all $@


if [[ $# -eq 0 ]]; then
FILES=`find . -type f`
else
EXCLUDE_FILES_EXP="("
for EXCLUDED_FILE in $@
do
    EXCLUDE_FILES_EXP="$EXCLUDE_FILES_EXP./$EXCLUDED_FILE|"
done
# strip last char
EXCLUDE_FILES_EXP="${EXCLUDE_FILES_EXP%?}"
EXCLUDE_FILES_EXP="$EXCLUDE_FILES_EXP)"
echo exluded files expression :  $EXCLUDE_FILES_EXP

     FILES=`find . -type f | egrep -v $EXCLUDE_FILES_EXP`
fi

echo removing $FILES

for FILE in $FILES
do
    echo "cleanup: removing file $FILE"
    rm $FILE
done