Grep cho cái này và KHÔNG cái đó trong một tập tin?


0

Làm cách nào tôi có thể grep cho các tệp trong cấu trúc thư mục có văn bản này

addDesignControlChangeNotification

nhưng thiếu văn bản này

removeDesignControlChangeNotification

Cảm ơn!

Lưu ý: Ý tôi là thư mục tập lệnh bắt đầu và tất cả các thư mục con.


Hmm, trong thư mục chính, hoặc thư mục chính và thư mục con?
Rich Homolka

Tôi có nghĩa là thư mục chúng tôi bắt đầu kịch bản trong và tất cả các thư mục con. Xin lỗi điều đó không rõ ràng trước đây.
Dan Rosenstark

Câu trả lời:


1

Đây là một câu hỏi dựa trên câu trả lời của Rich Homolka , nhưng hoạt động trên cây thư mục:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

Bất kỳ tập tin trả lại sẽ chứa addDesignControlChangeNotificationnhưng không removeDesignControlChangeNotification.

GIẢI TRÌNH:

  • find . -type f -exec grep -l foo {} \;: Điều này sẽ in tất cả các tệp trong bất kỳ thư mục con nào của thư mục hiện tại có chứa chuỗi foo. Các -llá cờ gây grep để chỉ in tên của tập tin phù hợp.

  • while read file: điều này lặp lại qua từng tệp được tìm thấy ở trên, lưu tên của nó trong biến $file.

  • grep -q bar "$file" > /dev/null: comand này loks cho chuỗi bartrong mỗi tệp có chứa foo.

  • [ $? -ne 0 ] && echo $file;: Nếu giá trị trả về ( $?) của greplệnh là 0 (nghĩa là nếu chuỗi không có trong tệp), hãy in tên của tệp.


Tuyệt vời, tôi đang sử dụng find . -name '*.m' -type f -exec grep -l addDesignControlChangeNotification {}... cái mà tôi đã thêm vào vì tôi không đề cập đến nó trong câu hỏi;) Cảm ơn!
Dan Rosenstark

2

cái này nên hoạt động:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done

Trông thật tuyệt, nhưng tôi nhận được "Là một thư mục" thay vì thực sự nhập vào các thư mục đó. Bất cứ ý tưởng những gì sai? Cảm ơn bạn +1!
Dan Rosenstark

@Yar, bạn có thể thêm một lệnh -rđầu tiên grepnếu bạn muốn lặp lại các thư mục. Hoặc bạn có thể sử dụng câu trả lời của tôi;).
terdon

0

Lót:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -rlà một grep đệ quy, <()sự thay thế quá trìnhcommhiển thị cho bạn các dòng mà một cặp tệp (được sắp xếp) có / không có chung. Trong trường hợp này, chúng tôi chỉ muốn đầu ra của cột 1: các dòng trong tệp đầu tiên (trong đó "tệp" thực sự là đầu ra grep) không nằm trong tệp thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.