Bagaimana cara saya mengambil angka saja di grep?

58

Saya punya file seperti ini:

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

Saya ingin menemukan angka-angka dalam file di atas. Saya datang dengan:

grep [0-9] filename

Tapi itu adalah mencetak keseluruhan:

blah blah blah (:34)

Sebaliknya saya hanya ingin 34. Apakah ada cara untuk melakukannya?

Semut
sumber
Di masa depan, periksa juga halaman manual untuk grep (atau program lain). Halaman manual merinci opsi-opsi yang diperlukan untuk banyak penggunaan umum program. misman grep
hnasarat
Anda dapat mencoba ini> grep -o '[0-9] [0-9] *' testfile

Jawaban:

76

Anda dapat menggunakan grep -Euntuk mengakses sintaks ekspresi reguler yang diperluas (Sama seperti egrep )

Saya telah membuat file testfile dengan konten di bawah ini:

>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)

Sekarang untuk mengambil angka-angka saja dari teks yang dapat Anda gunakan

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

akan menjadi output.

Di sini "-o" digunakan untuk hanya menampilkan segmen pencocokan garis, daripada isi penuh garis.

Kurung berlekuk-lekuk (misalnya {dan}) menunjukkan jumlah instance pertandingan. {1,4} mensyaratkan bahwa karakter sebelumnya atau kelas karakter harus muncul setidaknya sekali, tetapi tidak lebih dari empat kali.

Semoga ini membantu

devav2
sumber
3
Bagus. Juga, untuk mencocokkan lebih dari 4 atau jumlah angka acak, gunakan grep -Eo '[0-9]{1,}' testfile
FractalSpace
9

Anda dapat menggunakan ekspresi braket RE yang [:digit:]ditentukan oleh bagian 9.3.5 dari standar POSIX , dikombinasikan dengan -obendera untuk mencetak hanya kata-kata yang cocok.

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

grep -ohanya akan mencetak bagian yang cocok dari garis. Kalau tidak, grep akan mencetak garis apa pun dengan pola.

roadmr
sumber
1

Saya akan menggunakan curl untuk mengakses file Anda secara lokal atau jarak jauh, maka saya akan grep garis dengan angka yang dibungkus (:) kemudian memotong potongan-potongan itu dan menulis ke file

jawaban yang diterima mengabaikan mungkin ada nomor di baris file sebelumnya, itu berfungsi untuk data contoh, tetapi bagaimana jika file itu jauh?

Lokal

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

Dalam contoh ini output.txtdi folder Anda saat ini akan ditulis, kami mengakses input.txtdari folder Publik Anda.

Terpencil

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

Dalam contoh ini output.txtdi folder Anda saat ini akan ditulis, kami mengakses input.txtdari https://yoursite.com/Public/.

Stef
sumber
1
Mengapa menggunakan curlsaat yang sederhana catakan dilakukan?
PerlDuck
Pertanyaannya tidak dengan jelas menyatakan bahwa file tersebut adalah lokal. jawaban ini memungkinkan untuk keduanya.
Stef