Câu trả lời:
head
lấy các dòng đầu tiên từ một tệp và -n
tham số có thể được sử dụng để chỉ định số lượng dòng nên được trích xuất:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
mở một subshell như $()
vậy?.
$()
cú pháp dễ nhìn hơn và giá trị rõ ràng hơn độ căng tuyệt đối. gnu.org/software/bash/manual/html_node/ từ
để đọc dòng đầu tiên bằng cách sử dụng bash, sử dụng read
câu lệnh. ví dụ
read -r firstline<file
firstline
sẽ là biến của bạn (Không cần gán cho người khác)
cat ... | read VAR
sẽ thất bại trong hầu hết các shell (tất cả ngoại trừ zsh
theo như tôi biết) bởi vì mỗi thành phần trong một đường ống sẽ chạy trong các lớp con riêng biệt. Có nghĩa là nó $VAR
sẽ được đặt trong subshell (nó sẽ không còn tồn tại ngay khi đường ống đã hoàn thành thực thi) chứ không phải trong vỏ gọi. Bạn có thể giải quyết vấn đề này với read VAR <<EOF\n$(cat ...)\nEOF
(trong đó mỗi \n
dòng là một dòng mới).
cat
là chi phí thuần túy; hiệu quả read -r var <file
hơn nhiều so với bất kỳ cách nào cat file | read
, ngay cả khi điều sau không thất bại vì những lý do được mô tả trong BashFAQ # 24 .
cat
, thìread -r var < <(otherprog ...)
Điều này đủ và lưu trữ dòng đầu tiên filename
trong biến $line
:
read -r line < filename
Tôi cũng thích awk
điều này:
awk 'NR==1 {print; exit}' file
Để lưu trữ chính dòng, sử dụng var=$(command)
cú pháp. Trong trường hợp này , line=$(awk 'NR==1 {print; exit}' file)
.
Hoặc thậm chí sed
:
sed -n '1p' file
Với tương đương line=$(sed -n '1p' file)
.
Xem một mẫu khi chúng tôi cung cấp read
với seq 10
, đó là một chuỗi các số từ 1 đến 10:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(hoặc sed -n '1p;q'
) sẽ bắt chước awk
logic của bạn và ngăn việc đọc thêm vào tệp. Bởi vì chúng tôi chỉ muốn dòng đầu tiên, chúng ta có thể lựa chọn gian lận với sed q
hoặc awk '1;{exit}'
hoặc thậm chí grep -m1 ^
(ít mã, cùng một logic cần thiết). (Đây không phải là câu trả lời cho cuộc điều tra downvote.)
grep
rất thông minh. Tất nhiên chúng ta cũng có thể nói head -n 1 file
.
head -n1
sẽ nhanh hơn (tải nhị phân nhỏ hơn) và read
sẽ nhanh nhất (không tải nhị phân, đó là nội dung). Tôi đặc biệt thích grep -m1 --color .
khi tôi chỉ in dòng đầu tiên vì nó cũng sẽ tô màu dòng đó, làm cho nó tuyệt vời cho tiêu đề bảng.
line=$(head -1 file)
Sẽ làm việc tốt. (Như câu trả lời trước). Nhưng
line=$(read -r FIRSTLINE < filename)
sẽ nhanh hơn một chút so với read
lệnh bash tích hợp.
read
không in bất cứ thứ gì (vì vậy, để line
trống) và cũng thực hiện trong một khung con (vì vậy FIRSTLINE
được đặt thành dòng đầu tiên, nhưng chỉ trong dòng con, vì vậy nó không có sẵn sau đó). Giải pháp: chỉ cần sử dụngread -r line <filename
Câu hỏi không hỏi cái nào nhanh nhất, nhưng để thêm vào câu trả lời sed, -n '1p' hoạt động kém vì không gian mẫu vẫn được quét trên các tệp lớn. Vì tò mò tôi thấy rằng 'cái đầu' chiến thắng trong sed một cách hẹp hòi:
# best:
head -n1 $bigfile >/dev/null
# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null
# VERY slow:
sed -n '1p' $bigfile >/dev/null
read
cách tiếp cận.$()
loại bỏ một lớp con và sử dụng lệnh bên ngoài ( bất kỳ lệnh bên ngoài nào ) có nghĩa là bạn đang gọiexecve()
, gọi trình liên kết và trình tải (nếu nó sử dụng các thư viện dùng chung, thường là như vậy), v.v.