Yanıtlar:
head
dosyadan ilk satırları alır ve -n
parametre kaç satırın ayıklanması gerektiğini belirtmek için kullanılabilir:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
olduğu gibi bir alt kabuk açar $()
mı?
$()
sözdiziminin görülmesinin daha kolay olduğunu ve mutlak terslik karşısında netliğe değer verdiğini düşünüyorum. gnu.org/software/bash/manual/html_node/…
bash kullanarak ilk satırı okumak için read
deyimi kullanın . Örneğin
read -r firstline<file
firstline
değişkeniniz olacak (başkasına atamanıza gerek yok)
cat ... | read VAR
çoğu mermide başarısız olur ( zsh
bildiğim kadarıyla hariç ) çünkü bir borudaki bileşenlerin her biri ayrı alt kabuklarda çalışacaktır. Bu $VAR
, çağrılan kabuktan ziyade alt kabukta (boru hattının yürütülmesi biter bitmez varolması) ayarlanacak anlamına gelir . Bununla read VAR <<EOF\n$(cat ...)\nEOF
(her birinin \n
yeni satır olduğu) bu sorunu çözebilirsiniz .
cat
saf yük; çok daha verimli için read -r var <file
daha cat file | read
nasıl olsa bile eğer ikincisi açıklanan nedenlerle başarısız olmamış BashFAQ # 24 .
cat
, o zamanread -r var < <(otherprog ...)
Bu filename
, değişkenin ilk satırını yeterlidir ve saklar $line
:
read -r line < filename
Ben de awk
bunun için:
awk 'NR==1 {print; exit}' file
Çizginin kendisini saklamak için var=$(command)
sözdizimini kullanın. Bu durumda line=$(awk 'NR==1 {print; exit}' file)
,.
Hatta sed
:
sed -n '1p' file
Eşdeğeri ile line=$(sed -n '1p' file)
.
Besleyecek Bir örnek bakınız read
ile seq 10
1 ila 10 bir sayı dizisi olduğunu:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(veya sed -n '1p;q'
) awk
mantığınızı taklit eder ve dosyanın daha fazla okunmasını önler. Biz sadece ilk satırı istediğimiz için, alternatif ile hile sed q
veya awk '1;{exit}'
hatta grep -m1 ^
(daha az kod, aynı temel mantık). (Bu, downvote soruşturmasının bir cevabı değildir.)
grep
Çok akıllı olanı buluyorum . Tabii ki de söyleyebiliriz head -n 1 file
.
head -n1
daha hızlı (yüklenecek daha küçük ikili) ve read
en hızlı olacak (yüklenecek ikili değil, bu bir yerleşiktir). Özellikle grep -m1 --color .
sadece ilk satırı yazdırdığımda hoşuma gidiyor çünkü çizgiyi de renklendirecek ve tablo başlıkları için harika olacak.
line=$(head -1 file)
İyi çalışır. (Önceki cevap olarak). Fakat
line=$(read -r FIRSTLINE < filename)
read
yerleşik bir bash komutu gibi marjinal olarak daha hızlı olacaktır .
read
çalışmaz , çünkü hiçbir şey yazdırmaz (bu nedenle line
boştur) ve ayrıca bir alt kabukta yürütülür (bu nedenle FIRSTLINE
ilk satıra ayarlanır, ancak yalnızca alt kabukta bulunur, bu nedenle daha sonra kullanılamaz). Çözüm: sadece kullanınread -r line <filename
Soru hangisinin en hızlı olduğunu sormadı, ancak sed cevabına eklemek için -n '1p', desen alanı hala büyük dosyalarda tarandığından kötü performans gösteriyor. Meraktan 'kafa' nın dar bir şekilde kazanacağını fark ettim:
# 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
Yaklaşımdan önemli ölçüde daha fazla yük .$()
bir alt kabuğu çatalla ve harici bir komut ( herhangi bir harici komut) kullanmak, aradığınızexecve()
, bağlayıcıyı ve yükleyiciyi çağırdığınız anlamına gelir (genellikle böyle olan paylaşılan kütüphaneler kullanıyorsa, vb.)