Muszę wstawić zmienną bash do pierwszego wiersza pliku. Wydaje mi się, że dzieje się tak z poleceniem grep, ale czy można ograniczyć liczbę linii?
249
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)
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.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ładfirstline
będzie twoją zmienną (nie musisz przypisywać do innej)źródło
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 wydajneread -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
:Lubię też
awk
za to:Aby zapisać samą linię, użyj
var=$(command)
składni. W tym wypadkuline=$(awk 'NR==1 {print; exit}' file)
.Lub nawet
sed
:Z ekwiwalentem
line=$(sed -n '1p' file)
.Patrz próbki kiedy paszy
read
zseq 10
, to sekwencja liczb od 1 do 10:źródło
sed '1!d;q'
(lubsed -n '1p;q'
) naśladuje twojąawk
logikę i uniemożliwi dalsze wczytywanie do pliku. Ponieważ chcemy tylko pierwszy wiersz, możemy oszukać alternatywnie zsed q
lubawk '1;{exit}'
nawetgrep -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) iread
będzie najszybszy (brak pliku binarnego do załadowania, to wbudowane). Szczególnie podobagrep -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.Będzie działać dobrze. (Jak poprzednia odpowiedź). Ale
będzie nieznacznie szybszy, podobnie jak
read
wbudowane polecenie bash.źródło
read
nic nie drukuje (więcline
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
Tylko
echo
pierwsza lista pliku źródłowego do pliku docelowego.źródło
head -n 1 source.txt > target.txt
osiągnie dokładnie to samo.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:
źródło