unix - varios - MĂșltiples grep buscar/ignorar patrones
grep varios patrones (5)
Por lo general, uso la siguiente canalización para grep para una cadena de búsqueda particular y, sin embargo, ignoro otros patrones:
grep -Ri 64 src/install/ | grep -v /.svn | grep -v "file"| grep -v "2/.5" | grep -v "2/.6"
¿Se puede lograr esto de manera sucinta? Estoy usando GNU grep 2.5.3.
Es posible que desee utilizar ack-grep que permite excluir también con perl regexp y evitar todos los directorios de VC, lo que es excelente para grepping código fuente.
La siguiente secuencia de comandos eliminará todos los archivos excepto una lista de archivos:
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
Simplemente canalice su salida sin filtrar en una sola instancia de grep y use una expresión regular extendida para declarar lo que quiere ignorar:
grep -Ri 64 src/install/ | grep -v -E ''(/.svn|file|2/.5|2/.6)''
Editar: Para buscar varios archivos tal vez intente
find ./src/install -type f -print |/
grep -v -E ''(/.svn|file|2/.5|2/.6)'' | xargs grep -i 64
Edición: Ooh. Olvidé agregar el truco simple para detener el uso de múltiples instancias de grep, a saber:
ps -ef | grep something | grep -v grep
Reemplazando eso con
ps -ef | grep "[s]omething"
elimina la necesidad del segundo grep.
Use la opción -e
para especificar múltiples patrones:
grep -Ri 64 src/install/ | grep -v -e ''/.svn'' -e file -e ''2/.5'' -e ''2/.6''
También podría interesarle el indicador -F
, que indica que los patrones son cadenas fijas en lugar de expresiones regulares. Ahora no tienes que escapar del punto:
grep -Ri 64 src/install/ | grep -vF -e .svn -e file -e 2.5 -e 2.6
Me di cuenta de que estabas grep saltando ".svn". Probablemente desee omitir cualquier directorio llamado ".svn" en su grep recursivo inicial. Si yo fuera tú, haría esto en su lugar:
grep -Ri 64 src/install/ --exclude-dir .svn | grep -vF -e file -e 2.5 -e 2.6
puedes usar awk en lugar de grep
awk ''/64/&&!/(/.svn|file|2/.[56])/'' file