Nhận dòng đầu tiên của đầu ra của lệnh shell


96

Trong khi cố gắng đọc số phiên bản vim, tôi nhận được rất nhiều dòng bổ sung mà tôi cần phải bỏ qua. Tôi đã cố đọc hướng dẫn sử dụng headvà thử lệnh sau:

vim --version | head -n 1

Tôi muốn biết liệu đây có phải là cách tiếp cận chính xác?


4
Nó đã thất bại như thế nào? Nó làm việc cho tôi.
choroba

1
Cú pháp đúng. Lỗi là gì ..?
Kaushik Nayak

1
Điều đó phù hợp với tôi, nhưng có lẽ bạn đang sử dụng phiên bản vim ghi thông tin phiên bản cho stderr. Hãy thửvim --version 2>&1 | sed 1q
William Pursell

Cũng phù hợp với tôi - vì vậy có, cách tiếp cận của bạn là đúng :)Kiểm tra xem gói của bạn có xuất ra thông tin đó stderrnhư @WilliamPursell cung cấp kiểm tra hay không.
David C. Rankin

Câu trả lời:


132

Vâng, đó là một cách để lấy dòng đầu ra đầu tiên từ một lệnh.

Nếu lệnh xuất bất kỳ thứ gì thành lỗi tiêu chuẩn mà bạn muốn nắm bắt theo cách tương tự, bạn cần chuyển hướng lỗi tiêu chuẩn của lệnh đến luồng đầu ra tiêu chuẩn:

utility 2>&1 | head -n 1

Có nhiều cách khác để ghi lại dòng đầu tiên, bao gồm sed 1q(bỏ sau dòng đầu tiên), sed -n 1p(chỉ in dòng đầu tiên, nhưng đọc mọi thứ), awk 'FNR == 1'(chỉ in dòng đầu tiên, nhưng đọc lại mọi thứ), v.v.


4

Tôi sẽ dùng:

awk 'FNR <= 1' file_*.txt

Như @Kusalananda đã chỉ ra rằng có nhiều cách để nắm bắt dòng đầu tiên trong dòng lệnh nhưng sử dụng head -n 1có thể không phải là lựa chọn tốt nhất khi sử dụng ký tự đại diện vì nó sẽ in thêm thông tin. Thay đổi 'FNR == i'để 'FNR <= i'cho phép lấy i dòng đầu tiên.

Ví dụ: nếu bạn có n tệp có tên tệp_1.txt, ... tệp_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Nhưng với các headký tự đại diện in tên của tệp:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye

1
Xemhead -qn1 file_*.txt
F. Hauri
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.