Grep'te sadece sayıları nasıl alırım?


56

Böyle bir dosya var:

 other lines . . .    
 blah blah blah (:34)

Yukarıdaki dosyada sayı oluşumunu bulmak istiyorum. Ben geldim:

grep [0-9] filename

Ancak bu bütün baskıdır:

blah blah blah (:34)

Aksine sadece istiyorum 34. Bunu yapmanın bir yolu var mı?


Gelecekte, grep (ya da başka bir program) için man sayfasına bakın. Kılavuz sayfası, programın birçok yaygın kullanımı için gerekli olan seçenekleri detaylandırmaktadır. egman grep
hnasarat

Bunu deneyebilirsiniz> grep -o '[0-9] [0-9] *'

Yanıtlar:


74

grep -EGenişletilmiş düzenli ifade sözdizimine erişmek için kullanabilirsiniz ( egrep ile aynı )

Aşağıdaki içerikleri içeren bir test dosyası oluşturdum:

>cat testfile
this is some text
with some random lines

again some text
ok now going for numbers (:32)
ok now going for numbers (:12)
ok now going for numbers (:132)
ok now going for numbers (:1324)

Şimdi metinden tek başına rakamları grep etmek için kullanabilirsiniz

>grep -Eo '[0-9]{1,4}' testfile
32
12
132
1324

çıktı olacak.

Burada "-o" , satırın tam içeriğinden ziyade yalnızca satırın eşleşen kısmını çıktılamak için kullanılır.

Dalgalı parantezler (örneğin {ve}) eşleşmenin örnek sayısını gösterir. {1,4}, önceki karakter veya karakter sınıfının en az bir kere, ancak dört defadan fazla olmamasını gerektirir.

Bu yardımcı olur umarım


3
Güzel. Ayrıca, 4’ten fazla veya rastgele basamak sayısının eşleşmesi için, şunu kullanın grep -Eo '[0-9]{1,}' testfile
FractalSpace

8

Yalnızca eşleşen "sözcükleri" yazdırmak için bayrakla birlikte POSIX standardının[:digit:] 9.3.5 bölümünde belirtilen RE parantezini kullanabilirsiniz.-o

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123

5

grep -oçizginin sadece eşleşen kısmını basacaktır. Aksi takdirde grep, desenli herhangi bir satır yazdırır.


1

Dosyanıza yerel olarak veya uzaktan erişmek için curl kullanırdım, daha sonra (:) içine sarılmış sayılarla satırları örterdim, sonra bu parçaları keser ve dosyaya yazardım

Kabul edilen cevap, dosyanın önceki satırlarında sayılar olabileceğini gözardı eder, örnek veriler için işe yarar, ancak dosya uzaktaysa ne olur?

Yerel

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

Bu örnekte output.txtmevcut klasörünüzün üzerine yazılacak input.txt, Ortak klasörünüzden erişiyoruz .

uzak

curl https://yoursite.com/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

Bu örnekte de output.txtgeçerli klasörde üzerinde yazılı olacak, biz erişen input.txtgelen https://yoursite.com/Public/.


1
Neden curlbir basit catyapacağı zaman kullanın ?
PerlDuck

Soru, dosyanın yerel olduğunu açıkça belirtmiyor. bu cevap her ikisine de izin verir.
Stef,
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.