Grep'in aynı dizeyi birden çok kez yazdırmasını nasıl önleyebilirim?


15

Aşağıdakileri içeren bir dosyayı grep edersem:

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

... kelime için These, dizeyi These are wordsdört kez yazdıracaktır .

Grep'in yinelenen dizeleri bir kereden fazla yazdırmasını nasıl önleyebilirim? Aksi takdirde, yinelenen satırları kaldırmak için grep çıktısını nasıl değiştirebilirim?


Maçların sırası çıktıda tutulmalı mı? Aksi takdirde, John1024'in yayınladığı komut çalışır.
kos

Yanıtlar:


23

Unix felsefesi, bir şeyi yapan ve bunları iyi yapan araçlara sahip olmaktır. Bu durumda, grepbir dosyadan metin seçen araçtır. Kopya olup olmadığını öğrenmek için metni sıralar. Kopyaları kaldırmak için, bir -useçeneği kullanılır sort. Böylece:

grep These filename | sort -u

sortbirçok seçeneği vardır: bkz man sort. Yinelenenleri saymak veya yinelenen veya neyin yinelenmediğini belirlemek için daha karmaşık bir şemaya sahip olmak istiyorsanız, sıralama çıktısını şuraya yönlendirin uniq: grep These filename | sort | uniqve manseçenekler için uniq'e bakın .


2

grepYalnızca tek bir dize arıyorsanız ve ek bir anahtar kullanma

grep -m1 'These' filename

itibaren 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.

veya kullanarak awk ;)

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

IMHO en uygun cevap -m bayrağıdır. Cevabınızın en üstüne koymanızı öneririm. Çok iyi cevap!
Sergiy Kolodyazhnyy

3
Bir regex kullanıyorsanız bu işe yaramaz - ilk maçtan hemen sonra durur, olası her maçtan birini ve yalnızca birini aldığınızdan emin olmaz.
csvan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.