Làm thế nào để ngăn grep in cùng một chuỗi nhiều lần?


14

Nếu tôi grep một tập tin có chứa những điều sau đây:

These are words
These are words
These are words
These are words

... cho từ này These, nó sẽ in chuỗi These are wordsbốn lần.

Làm cách nào tôi có thể ngăn grep in chuỗi định kỳ nhiều lần? Nếu không, làm thế nào tôi có thể thao tác đầu ra của grep để loại bỏ các dòng trùng lặp?


Thứ tự của các trận đấu nên được giữ trong đầu ra? Nếu không, lệnh John1024 được đăng sẽ hoạt động.
kos

Câu trả lời:


21

Triết lý của Unix là có các công cụ làm một việc và làm chúng tốt. Trong trường hợp này, greplà công cụ chọn văn bản từ một tệp. Để tìm ra nếu có trùng lặp, người ta sắp xếp văn bản. Để loại bỏ các bản sao, người ta sử dụng -utùy chọn để sort. Như vậy:

grep These filename | sort -u

sortcó nhiều lựa chọn: xem man sort. Nếu bạn muốn đếm các bản sao hoặc có sơ đồ phức tạp hơn để xác định cái gì không phải là bản sao, thì hãy đặt đầu ra sắp xếp thành uniq: grep These filename | sort | uniqvà xem manuniq` để biết các tùy chọn.


2

Sử dụng grepvà chuyển đổi bổ sung, nếu bạn chỉ tìm kiếm một chuỗi

grep -m1 'These' filename

Từ man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

hoặc sử dụng awk ;)

awk '/These/ {print; exit}' foo

IMHO câu trả lời thích hợp nhất là cờ -m. Tôi đề nghị bạn đặt nó ở đầu câu trả lời của bạn. Câu trả lời rất hay!
Sergiy Kolodyazhnyy

3
Điều này sẽ không hoạt động nếu bạn đang sử dụng regex - nó sẽ dừng ngay sau trận đấu đầu tiên, không đảm bảo bạn có được một và chỉ một trong mỗi trận đấu có thể.
csvan
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.