Несколько шаблонов поиска/игнорирования 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.
Ответы
Ответ 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