2009-08-31 45 views
20

Tôi thường sử dụng các đường ống dẫn sau để grep cho một chuỗi tìm kiếm cụ thể và chưa bỏ qua một số mô hình khác:Nhiều grep tìm kiếm/bỏ qua mẫu

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

thể này thể đạt được một cách gọn gàng? Tôi đang sử dụng GNU grep 2.5.3.

+0

Tính hữu ích của câu trả lời cũng phụ thuộc vào chuỗi có nhiều khả năng thay đổi. Nếu chuỗi thay đổi duy nhất là "64" tại sao bạn không tạo ra một hàm hoặc shell script cho điều này? – tripleee

Trả lời

25

Chỉ cần ống đầu ra không lọc của bạn thành một trường hợp duy nhất của grep và sử dụng một regexp mở rộng để khai báo những gì bạn muốn bỏ qua:

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

Edit: Để tìm kiếm nhiều file có thể thử

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

Chỉnh sửa: Ooh. Tôi quên để thêm các trick đơn giản để ngăn chặn việc sử dụng cringeable của nhiều trường grep, cụ thể là

ps -ef | grep something | grep -v grep 

Thay rằng với

ps -ef | grep "[s]omething" 

loại bỏ sự cần thiết của grep thứ hai.

+2

Dấu ngoặc đơn phải được trích dẫn .. nếu không bash than phiền: lỗi cú pháp gần mã thông báo bất ngờ '(' –

+0

Cập nhật! Cảm ơn. –

+0

Có một lỗi trong giải pháp của bạn và ví dụ trong câu hỏi của tôi: grep thứ hai sẽ khớp với dòng thực tế * và * Tên tập tin xuất hiện trong đầu ra của grep đầu tiên, tốt cho việc bỏ qua '.svn' .. nhưng không phải là các mẫu khác. –

1

Bạn có thể muốn sử dụng ack-grep cho phép loại trừ với regexp perl và tránh tất cả các thư mục VC, tuyệt vời để grepping mã nguồn.

+0

Cảm ơn con trỏ; đối với cây nguồn hoàn toàn là Python, tôi hiện đang sử dụng 'py.lookup' từ http://pylib.org/ –

2

bạn có thể sử dụng awk thay vì grep

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

Dòng in ngắn gọn này từ một tệp duy nhất, nhưng không thực hiện phép đệ quy từ grep đầu tiên. Nhưng nó có thể được sử dụng một cách hiệu quả kết hợp với gợi ý 'tìm | giải pháp xargs'. Cũng nên thêm in tên tệp trước trận đấu để mô phỏng hoàn toàn hành vi grep. – tripleee

7

Sử dụng tùy chọn -e để chỉ định nhiều mẫu:

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

Bạn cũng có thể quan tâm trong -F cờ, mà chỉ ra rằng mô hình được cố định chuỗi thay vì biểu thức chính quy. Bây giờ bạn không cần phải thoát khỏi dấu chấm:

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

Tôi nhận thấy bạn đã bỏ qua ".svn". Bạn có thể muốn bỏ qua bất kỳ thư mục có tên ".svn" trong grep đệ quy ban đầu của bạn. Nếu tôi là bạn, tôi sẽ làm điều này thay vì:

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

Các kịch bản sau đây sẽ loại bỏ tất cả các file trừ một danh sách các tập tin:

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 
Các vấn đề liên quan