Cara mencetak hanya pertandingan pertama dengan grep

14

Saya mencoba untuk mendapatkan nama pengguna:

users | grep "^\b\w*\b" -P

Bagaimana saya bisa membuatnya hanya menampilkan pertandingan pertama grep?

Yurij73
sumber
3
Mengapa grep? grepadalah untuk mencari. Anda tampaknya membutuhkan salah satu cutatau awk, tetapi readbuiltin juga tampaknya cocok.
manatwork
karya ini seperti yang diusulkan @peterph ^ \ w * \ b. Apakah potong atau sed / awk lebih nyaman? kasus saya sederhana. saya dapat menggunakan myVar = `pengguna | grep -o "^ \ w * \ b" `, tidak?
Yurij73
3
Membandingkan mereka: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Jika Anda ingin menyimpannya dalam variabel, gunakan bash: read myVar blah < <(users)atau read myVar blah <<< $(users).
manatwork
@ Yurij73 perbedaannya kebanyakan terletak pada waktu eksekusi. dengan readAnda tidak menelurkan proses baru. Jika Anda melakukan ini berkali-kali, Anda akan melihat perbedaannya.
peterph
Apakah lebih baik menggunakan awk? #! / bin / bash (pengguna | awk '$ 0 = $ 1')> file; baca myVar <file; rm -f file; echo $ myVar;
Yurij73

Jawaban:

9

Jika Anda benar-benar ingin mengembalikan hanya kata pertama dan ingin melakukan ini grepdan grepkebetulan Anda adalah versi terbaru dari GNU grep, Anda mungkin menginginkan -oopsi tersebut. Saya percaya Anda dapat melakukan ini tanpa -Pdan \bpada awalnya tidak benar-benar diperlukan. Oleh karena itu: users | grep -o "^\w*\b".

Namun, seperti @manatwork sebutkan, shell built-in readatau cut/ sed/ awktampaknya lebih sesuai (terutama sekali Anda sampai pada titik Anda perlu melakukan sesuatu yang lebih).

peterph
sumber
Sintaks alternatif:grep -o "[^ ]*"
kenorb
@kenorb yang agak berbeda sebenarnya (tetapi akan bekerja dalam kebanyakan kasus).
peterph
34

Untuk hanya menampilkan kecocokan pertama grep, gunakan -mparameter, misalnya:

grep -m1 pattern file

-m num, --max-count=num

Berhenti membaca file setelah angka cocok.

kenorb
sumber
1

itu bekerja untuk saya. tangkapan pertandingan pertama dengan:

users | grep -m 1 "^\b\w*\b"

dan tangkapan pertandingan terakhir dengan

users | grep "^\b\w*\b" |tail -1
foad322
sumber
0

Mengapa grep? The grepperintah untuk pencarian. Anda tampaknya memerlukan salah satu cutatau awk, tetapi read builtin juga tampaknya cocok.

Membandingkan mereka:

users | cut -d' ' -f1
users | sed 's/\s.*//'
users | awk '$0=$1'

Jika Anda ingin menyimpannya dalam variabel, menggunakan bash:

read myVar blah < <(users)

atau:

read myVar blah <<< $(users). 

Di atas jawaban berdasarkan komentar @manatwork .

kenorb
sumber