Множественный поиск grep / шаблоны игнорирования - PullRequest
20 голосов
/ 31 августа 2009

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

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

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

Ответы [ 5 ]

26 голосов
/ 31 августа 2009

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

8 голосов
/ 07 октября 2011

Используйте параметр -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". Возможно, вы захотите пропустить все каталоги с именем ".svn" в вашем начальном рекурсивном grep. Если бы я был тобой, я бы сделал это вместо:

grep -Ri 64 src/install/ --exclude-dir .svn | grep -vF -e file -e 2.5 -e 2.6
2 голосов
/ 01 сентября 2009

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

awk '/64/&&!/(\.svn|file|2\.[56])/' file
1 голос
/ 31 августа 2009

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

0 голосов
/ 09 сентября 2013

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

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...