Làm thế nào để in dòng đầu tiên bằng lệnh grep?


16

Tôi có một tập tin được gọi là file.txt. Làm thế nào tôi có thể in dòng đầu tiên chỉ bằng cách sử dụng greplệnh?


4
Sẽ head -1 file.txtkhông làm việc?
clk

@steel ấn bạn cần phải làm cho nó một câu trả lời vì đó là cách để làm điều đó với grep, công cụ được lựa chọn kỳ lạ cho công việc.
MelBurslan

1
grepkhông phải là công cụ tốt nhất để in dòng đầu tiên của tệp. Nếu bạn chỉ đơn giản có nghĩa là bạn muốn in dòng đầu tiên phù hợp với grephoặc nếu bạn có một số sử dụng cụ thể cho grep, xin vui lòng cho chúng tôi biết đó là gì. Nếu chúng tôi có nhiều bối cảnh hơn, có lẽ chúng tôi có thể đưa ra một câu trả lời sẽ giúp bạn và cộng đồng tốt hơn.
Đón

@MelBurslan Trong file.txt Tôi có ba dòng ví dụ: Đây là một tệp mới. Dòng thứ hai: Tên của tệp là newFile Dòng thứ ba: Tôi chưa tạo dòng mới. Vậy bằng cách sử dụng lệnh grep, làm thế nào tôi chỉ có thể in dòng đầu tiên? Ngoài ra, lệnh nào sẽ giúp tôi in cả dòng đầu tiên và dòng cuối cùng? Các bạn có thể vui lòng cho tôi biết các lệnh cho cả hai câu hỏi?
Nithin Santhosh

Nếu bất kỳ câu trả lời hiện có nào giải quyết được vấn đề của bạn, vui lòng xem xét chấp nhận nó thông qua dấu kiểm. Cảm ơn bạn!
Jeff Schaller

Câu trả lời:


37

Mặc dù đây là một ứng dụng độc đáo của grep, bạn có thể sử dụng nó bằng cách sử dụng

grep -m1 "" file.txt

Nó hoạt động vì biểu thức trống khớp với bất cứ thứ gì, trong khi -m1khiến grep thoát ra sau trận đấu đầu tiên

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1 để cho thấy rằng chuối phủ sô cô la ở đây không vô dụng như tôi nghĩ.
Kamil Maciorowski

4
Điều đó có thể hoạt động trên một số hệ thống, nhưng nó không khả dụng:grep: unknown option -- m
Kusalananda

1
Lưu ý sự khác biệt giữa 'dòng đầu tiên' và 'dòng đầu tiên phù hợp'
Charles

13

Đây không phải là một cái gì đó greplàm. Bản thân tên "grep" là từ viết tắt của " toàn cầu tìm kiếm một biểu thức chính quy và in", đó là những gì edlệnh g/re/pthực hiện (đối với một biểu thức chính quy định re).

edlà một trình chỉnh sửa dòng tương tác từ năm 1969, nhưng rất có thể nó đã được cài đặt trên hệ thống của bạn ngày hôm nay. Chúng tôi đã nhận greptừ ed, và nó có thể được xem như một phím tắt hoặc bí danh cho một chức năng cụ thể của ed, và sed, đó là "stream- ed", tức là một (không tương tác) biên tập suối.

Hãy sử dụng sedthay thế:

$ sed -n '1p' file.txt

Các 1pchuỗi là một nhỏ sed"kịch bản" mà bản in ( p) dòng tương ứng với địa chỉ nhất định ( 1, dòng đầu tiên). Lệnh chỉnh sửa 1psẽ (không có gì bất ngờ) làm điều tương tự trong edtrình chỉnh sửa .

Việc -nngăn chặn đầu ra của bất cứ thứ gì không được in rõ ràng bởi tập lệnh, vì vậy tất cả những gì chúng ta nhận được là dòng đầu tiên của tệp file.txt.

Cách khác:

$ sed '1q' file.txt

Điều này in tất cả các dòng của tệp, nhưng thoát ( q) ở dòng 1 (sau khi in). Điều này chính xác tương đương với head -n 1 file.txt.

Trong tiêu chuẩn POSIX, nó nói (khái quát hóa) head -n Ngiống như sed 'Nq'"in mọi dòng, nhưng thoát khỏi dòng N". Lý do headđược bao gồm trong tiêu chuẩn hoàn toàn là do tính đối xứng với tail(và khả năng tương thích ngược với các triển khai Unix hiện có).


Đây là câu trả lời rõ ràng nhất, câu trả lời đầu tiên là một hack kỳ lạ. Tôi biết có một cái gì đó kỳ lạ, cảm ơn bạn đã cho tôi thấy lịch sử của grep và ed. Điều này thật ý nghĩa ngay lúc này.
Tomas Zubiri

6

Trừ khi dòng đầu tiên có một chuỗi duy nhất, bạn không thể thực hiện điều này bằng cách chỉ sử dụng grep. head -n 1 file.txtsẽ làm việc ở vị trí của nó.

Nếu bạn muốn chỉ in ra dòng đầu tiên nếu nó phù hợp với một mẫu thì đầu ống vào grep

head -n 1 * | grep [pattern]


2

Tuy nhiên, một cách sử dụng khác thường của Grep - Biến đổi Schwartzian trải qua một số hướng để đánh số các dòng, sau đó sử dụng grep để tìm số dòng, sau đó loại bỏ số dòng trở lại:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Tôi đang đặt Câu trả lời này ở đây như một ví dụ về ý tưởng rằng chỉ vì bạn có thể làm gì đó trong (grep hoặc bash hoặc ... vv), không có nghĩa là bạn nên - có lẽ là một công cụ tốt hơn cho công việc. sed ( sed 1qhoặc sed -n 1p) và head ( head -n 1) là những công cụ thích hợp hơn để in dòng đầu tiên từ một tệp. Để in dòng cuối cùng của tệp, bạn có tail -n 1hoặcsed -n '$p'. Các công cụ này không chỉ là một lệnh duy nhất (thay vì 3+ trong các chức năng trên), chúng còn rõ ràng hơn nhiều đối với các độc giả tương lai - có lẽ là chính bạn! - trong số các kịch bản mà họ tham gia. Mặc dù tôi không phải là một trong số (hiện tại là 3) người bỏ phiếu cho câu hỏi của bạn, nhưng có khả năng sự khăng khăng của bạn đối với một công cụ tùy tiện cho công việc (không có bất kỳ lý do hỗ trợ nào) là lý do cho các downvote. Đó là cực kỳ không chắc rằng một hệ thống mà có grepkhông cũng có head, tailsed.

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.