Loại trừ các tệp có dòng văn bản rất dài từ đầu ra grep


18

Tôi thường chạy các lệnh grep để tìm các thứ trong mã của mình, nhưng vấn đề với các dự án web là thường sẽ có các tệp JavaScript và CSS được nén tạo ra một dòng văn bản lớn, do đó, nếu tìm thấy kết quả khớp, toàn bộ cửa sổ đầu cuối là lấp đầy hơn 1000 dòng, khiến việc tìm kiếm thứ tôi đang tìm kiếm trở nên vô cùng không thực tế.

Vì vậy, có cách nào để tránh các tệp có dòng văn bản đơn hơn 200 ký tự không?

Câu trả lời:


20

Với GNU grep và xargs:

grep -rLZE '.{200}' . | xargs -r0 grep pattern

Ngoài ra, bạn có thể cắt đầu ra của grep:

grep -r pattern . | cut -c1-"$COLUMNS"

hoặc nói với thiết bị đầu cuối của bạn không bọc văn bản nếu nó hỗ trợ nó:

tput rmam
grep -r pattern .

hoặc dùng less -S

grep -r pattern . | less -S

3
Sử dụng regex từ ví dụ đầu tiên của bạn, chuyển thành grep với khớp đảo ngược ... | grep -v -E '.{200}', cũng hoạt động. Ví dụ: để tìm tất cả các dòng tệp * .js trong thư mục hiện tại có ".name" trong đó không quá 200 ký tự: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver

3

Tùy chọn 1: Bạn có thể loại trừ các tệp khớp với một mẫu nhất định:

grep --exclude='*.min.*'

Điều này sẽ loại trừ script.min.jsstyle.min.css... grepTùy chọn khác bao gồm --exclude-from=FILE--exclude-dir=DIR

Tùy chọn 2: Tôi không chắc điều này có thực tế hay không, nhưng bạn có thể cut200 ký tự đầu tiên của mỗi dòng, sau đó là grep:

grep -H [OPTIONS] PATTERN [FILE...] | cut -c1-200 | grep PATTERN

Cái đầu tiên grepthực hiện khớp ban đầu và xuất tên tệp và dòng, cái thứ hai đảm bảo PATTERNvẫn còn đó sau khi cutting các dòng.


2

Trong tình huống này, tôi muốn grep một mẫu với bối cảnh vùng lân cận (giả sử 30 ký tự):

grep -Po '.{0,30}pattern.{0,30}' *.js
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.