Odpowiedzi:
head
pobiera pierwsze wiersze z pliku, a -n
parametru można użyć do określenia, ile wierszy należy wyodrębnić:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
otwartej podpowłoki, podobnie $()
jak ?.
$()
składnia jest łatwiejsza do zauważenia i cenię przejrzystość ponad absolutną zwięzłość. gnu.org/software/bash/manual/html_node/…
aby przeczytać pierwszą linię za pomocą bash, użyj read
instrukcji. na przykład
read -r firstline<file
firstline
będzie twoją zmienną (nie musisz przypisywać do innej)
cat ... | read VAR
zawiedzie w większości powłok (wszystkie z wyjątkiem, zsh
o ile wiem), ponieważ każdy ze składników potoku będzie działał w osobnych podpowłokach. Oznacza to, że $VAR
zostanie ustawione w podpowłoce (która przestanie istnieć, gdy tylko potok zakończy działanie), a nie w powłoce wywołującej. Możesz to obejść za pomocą read VAR <<EOF\n$(cat ...)\nEOF
(gdzie każdy \n
jest nowym wierszem).
cat
to czysty narzut; znacznie bardziej wydajne read -r var <file
niż cat file | read
jakikolwiek, nawet jeśli ten ostatni nie zawiódł z powodów opisanych w BashFAQ # 24 .
cat
, toread -r var < <(otherprog ...)
To wystarcza i przechowuje pierwszy wiersz filename
zmiennej $line
:
read -r line < filename
Lubię też awk
za to:
awk 'NR==1 {print; exit}' file
Aby zapisać samą linię, użyj var=$(command)
składni. W tym wypadku line=$(awk 'NR==1 {print; exit}' file)
.
Lub nawet sed
:
sed -n '1p' file
Z ekwiwalentem line=$(sed -n '1p' file)
.
Patrz próbki kiedy paszy read
z seq 10
, to sekwencja liczb od 1 do 10:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(lub sed -n '1p;q'
) naśladuje twoją awk
logikę i uniemożliwi dalsze wczytywanie do pliku. Ponieważ chcemy tylko pierwszy wiersz, możemy oszukać alternatywnie z sed q
lub awk '1;{exit}'
nawet grep -m1 ^
(mniej kodu, tak samo niezbędna logika). (To nie jest odpowiedź na negatywne zapytanie).
grep
bardzo mądry. Oczywiście możemy również powiedzieć head -n 1 file
.
head -n1
będzie szybszy (mniejszy plik binarny do załadowania) i read
będzie najszybszy (brak pliku binarnego do załadowania, to wbudowane). Szczególnie podoba grep -m1 --color .
mi się, gdy drukuję tylko pierwszą linię, ponieważ również pokoloruje linię, dzięki czemu świetnie nadaje się do nagłówków tabel.
line=$(head -1 file)
Będzie działać dobrze. (Jak poprzednia odpowiedź). Ale
line=$(read -r FIRSTLINE < filename)
będzie nieznacznie szybszy, podobnie jak read
wbudowane polecenie bash.
read
nic nie drukuje (więc line
kończy się pusta), a także wykonuje się w podpowłoce ( FIRSTLINE
ustawia się w pierwszej linii, ale tylko w podpowłoce, więc nie jest dostępna później). Rozwiązanie: po prostu użyjread -r line <filename
Pytanie nie zadawało, które jest najszybsze, ale aby dodać do odpowiedzi sed, -n „1p” ma niską wydajność, ponieważ przestrzeń wzorców jest nadal skanowana na dużych plikach. Z ciekawości odkryłem, że „głowa” wygrywa nad sedem wąsko:
# 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
podejście.$()
rozwidla podpowłokę, a użycie polecenia zewnętrznego ( dowolnego polecenia zewnętrznego) oznacza, że dzwoniszexecve()
, wywołujesz linker i moduł ładujący (jeśli korzysta z bibliotek współdzielonych, co zwykle ma miejsce), itp.