Подтвердить что ты не робот

Несколько шаблонов поиска/игнорирования grep

Обычно я использую следующий конвейер для grep для конкретной строки поиска и все же игнорирую некоторые другие шаблоны:

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

Можно ли это сделать лаконично? Я использую GNU grep 2.5.3.

4b9b3361

Ответ 1

Просто проведите свой нефильтрованный вывод в один экземпляр 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"

удаляет необходимость второго grep.

Ответ 2

Используйте параметр -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

Я заметил, что вы были grepping вне..svn. Вероятно, вы захотите пропустить любые каталоги с именем ".svn" в вашем исходном рекурсивном grep. Если бы я был вами, я бы сделал это вместо этого:

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

Ответ 3

вы можете использовать awk вместо grep

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

Ответ 4

Возможно, вы захотите использовать ack-grep, которые также позволяют исключать с помощью perl regexp и избегать всех каталогов VC, отлично подходит для grepping исходный код.

Ответ 5

Следующий script удалит все файлы, кроме списка файлов:

echo cleanup_all [email protected]


if [[ $# -eq 0 ]]; then
FILES=`find . -type f`
else
EXCLUDE_FILES_EXP="("
for EXCLUDED_FILE in [email protected]
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