Cách in chỉ trận đấu đầu tiên với grep


14

Tôi đang cố grep tên người dùng:

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

Làm thế nào tôi có thể làm cho nó chỉ hiển thị trận đấu đầu tiên với grep?


3
Tại sao grep? greplà để tìm kiếm. Bạn có vẻ cần cuthoặc awk, nhưng readnội dung cũng có vẻ phù hợp.
manatwork

công việc này như @peterph đề xuất ^ \ w * \ b. Được cắt hoặc sed / awk thuận tiện hơn? trường hợp của tôi rất đơn giản tôi có thể sử dụng myVar = `users | grep -o "^ \ w * \ b" `, không?
Yurij73

3
Hãy so sánh họ: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Nếu bạn muốn lưu trữ nó trong một biến, sử dụng bash: read myVar blah < <(users)hoặc read myVar blah <<< $(users).
manatwork

@ Yurij73 sự khác biệt chủ yếu nằm ở thời gian thực hiện. với readbạn không sinh ra một quá trình mới. Nếu bạn làm điều này nhiều lần, bạn sẽ nhận thấy sự khác biệt.
peterph

Nó sử dụng tốt hơn awk? #! / bin / bash (người dùng | awk '$ 0 = $ 1')> tệp; đọc myVar <file; tập tin rm -f; tiếng vang $ myVar;
Yurij73

Câu trả lời:


9

Nếu bạn thực sự muốn trả về chỉ từ đầu tiên và muốn làm điều này với grepgrepđây là phiên bản GNU gần đây grep, bạn có thể muốn -otùy chọn này. Tôi tin rằng bạn có thể làm điều này mà không cần -P\bngay từ đầu là không thực sự cần thiết. Do đó : users | grep -o "^\w*\b".

Tuy nhiên, như @manatwork đã đề cập, shell tích hợp readhoặc cut/ sed/ awkdường như phù hợp hơn (đặc biệt là khi bạn đạt đến điểm bạn cần phải làm gì đó nhiều hơn).


Cú pháp thay thế:grep -o "[^ ]*"
kenorb

@kenorb thực sự khác một chút (nhưng sẽ hoạt động trong hầu hết các trường hợp).
peterph

34

Chỉ hiển thị trận đấu đầu tiên với grep , sử dụng -mtham số, ví dụ:

grep -m1 pattern file

-m num, --max-count=num

Dừng đọc tệp sau khi num khớp.


1

nó làm việc cho tôi. Trận đấu đầu tiên bắt với:

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

và trận đấu cuối cùng với

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

0

Tại sao grep? Các greplệnh là để tìm kiếm. Bạn dường như cần một trong hai cuthoặc awk, nhưng BUILTIN đọc cũng có vẻ phù hợp.

So sánh chúng:

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

Nếu bạn muốn lưu trữ nó trong một biến, sử dụng bash:

read myVar blah < <(users)

hoặc là:

read myVar blah <<< $(users). 

Câu trả lời trên dựa trên ý kiến ​​@manatwork .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.