2011-07-19 13 views
38

Sadece bu kodu örnek olarak alın. Bir HTML/metin dosyası gibi davranarak, echo'un göründüğü toplam süreyi bilmek istersem, bash kullanarak nasıl yapabilirim?Bash kullanarak bir dosya içindeki bir dizenin oluşumlarını nasıl sayabilirim?

new_user() 
{ 
    echo "Preparing to add a new user..." 
    sleep 2 
    adduser  # run the adduser program 
} 

echo "1. Add user" 
echo "2. Exit" 

echo "Enter your choice: " 
read choice 


case $choice in 
    1) new_user  # call the new_user() function 
     ;; 
    *) exit 
     ;; 
esac 

cevap

51

çıktısı verir hatları arama dizesini içeren sayısı.

grep -c "echo" FILE 

Ancak bu, dosyadaki olay sayısını saymaz (yani, bir hat üzerinde eko birden çok kez varsa).

düzenleme:

sed 's/echo/echo\n/g' FILE | grep -c "echo" 

Bu temelde yankı her örneği bu kadar izleyen bir yeni satır ekler:, kodun bu kirli biraz kullanarak olay sayısını alabilir

biraz etrafında oynadıktan sonra Her birini kendi satırlarında, grep'in bu satırları saymasına izin verin. Örneğin, "yankı" kelimesinin aksine "yankı" kelimesini kullanmak isterseniz normal ifadeyi hassaslaştırabilirsiniz.

+0

Yani aynı çizgide birkaç yankı varsa ne yapabilirim? örn. echo time echo a echo –

+0

Sizin için çalışacak olan cevabımı güncelledim. –

+0

Teşekkürler. Birkaç dakika daha harca, Bir soru daha. eğer echo'nun üçüncü dönemini silmek istersem. ne yapabilirim? –

0

Burada bazı tahminler yapıyorum, çünkü ne istediğini tam olarak anlamadım.

Bence istediğin, verilen dosyada desenin yankılanacağı satır sayısıdır.

Örnek metninizi 6741967 adlı bir dosyaya yapıştırdım.

[email protected]:tmp$grep echo 6741967 
    echo "Preparing to add a new user..." 
echo "1. Add user" 
echo "2. Exit" 
echo "Enter your choice: " 

İkinci, çizgiler

[email protected]:tmp$grep echo 6741967 | wc -l 
     4 
+0

yardımlarınız için teşekkürler. Kafanı karıştırdığım için üzgünüm.Benim sorum –

+2

dosyadaki olay sayısını saymak için Eğer grep -o echo 6741967 yaparsanız, her biri için yeni bir satır çıktı, sonra kullanabilirsiniz: grep -o echo 6741967 | wc -l ve tek bir satırda çoklu 'echo'lar için de hesaba katıyor – Wivlaro

87

dize oluşumları (değil hatları) sayısı ile grep kullanılarak elde edilebilir saymak için wc -l kullanın:

Öncelikle grep eşleşmeleri bulur -o seçeneği ve wc (kelime sayısı):

$ echo "echo 1234 echo" | grep -o echo 
echo 
echo 
$ echo "echo 1234 echo" | grep -o echo | wc -l 
2 

Yani sorun için tam bir çözüm şu şekilde görünecektir:

$ grep -o "echo" FILE | wc -l 
+0

Zaman karmaşıklığı konusunda emin değilim, basit bir çözüm hissediyorum – kishorebjv

İlgili konular