Antworten:
head
Nimmt die ersten Zeilen aus einer Datei und der -n
Parameter kann verwendet werden, um anzugeben, wie viele Zeilen extrahiert werden sollen:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
Open eine Subshell wie $()
?
$()
Syntax leichter zu erkennen ist und Klarheit über absolute Knappheit steht. gnu.org/software/bash/manual/html_node/…
Verwenden Sie die read
Anweisung , um die erste Zeile mit bash zu lesen . z.B
read -r firstline<file
firstline
wird Ihre Variable sein (keine Notwendigkeit, einem anderen zuzuweisen)
cat ... | read VAR
wird in den meisten Shells fehlschlagen (alle außer zsh
soweit ich weiß), da jede der Komponenten in einem Rohr in separaten Subshells ausgeführt wird. $VAR
Dies bedeutet, dass dies in der Subshell (die nicht mehr vorhanden ist, sobald die Ausführung der Pipeline abgeschlossen ist) und nicht in der aufrufenden Shell festgelegt wird. Sie können dies umgehen mit read VAR <<EOF\n$(cat ...)\nEOF
(wobei jede \n
eine neue Zeile ist).
cat
ist reiner Overhead; viel effizienter read -r var <file
als cat file | read
sowieso, auch wenn letzteres aus den in BashFAQ # 24 beschriebenen Gründen nicht fehlgeschlagen ist .
cat
, dannread -r var < <(otherprog ...)
Dies reicht aus und speichert die erste Zeile von filename
in der Variablen $line
:
read -r line < filename
Ich mag auch awk
dafür:
awk 'NR==1 {print; exit}' file
Verwenden Sie die var=$(command)
Syntax, um die Zeile selbst zu speichern . In diesem Fall line=$(awk 'NR==1 {print; exit}' file)
.
Oder sogar sed
:
sed -n '1p' file
Mit dem Äquivalent line=$(sed -n '1p' file)
.
Sehen Sie sich ein Beispiel an, wenn wir das read
mit seq 10
einer Zahlenfolge von 1 bis 10 füttern :
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(oder sed -n '1p;q'
) ahmt Ihre awk
Logik nach und verhindert, dass Sie weiter in die Datei lesen. Da wir nur die erste Zeile wollen, können wir alternativ mit sed q
oder awk '1;{exit}'
oder sogar betrügen grep -m1 ^
(weniger Code, dieselbe wesentliche Logik). (Dies ist keine Antwort auf die Downvote-Anfrage.)
grep
sehr klug. Das können wir natürlich auch sagen head -n 1 file
.
head -n1
wird schneller sein (kleinere Binärdatei zum Laden) und read
wird am schnellsten sein (keine Binärdatei zum Laden, das ist eingebaut). Ich mag es besonders, grep -m1 --color .
wenn ich nur die erste Zeile drucke, weil sie auch die Zeile färbt und sich hervorragend für Tabellenüberschriften eignet.
line=$(head -1 file)
Wird gut funktionieren. (Wie vorherige Antwort). Aber
line=$(read -r FIRSTLINE < filename)
wird geringfügig schneller sein als read
ein eingebauter Bash-Befehl.
read
sie nichts druckt (wird also line
leer) und auch in einer Unterschale ausgeführt (wird also FIRSTLINE
auf die erste Zeile gesetzt, aber nur in der Unterschale, sodass sie danach nicht verfügbar ist). Lösung: verwenden Sie einfachread -r line <filename
Bei der Frage wurde nicht gefragt, welche am schnellsten ist, aber um die sed-Antwort zu ergänzen, ist -n '1p' schlecht, da der Musterbereich immer noch in großen Dateien gescannt wird. Aus Neugier fand ich heraus, dass 'Kopf' nur knapp über Sed gewinnt:
# 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
Ansatz.$()
Wenn Sie eine Subshell abschalten und einen externen Befehl (einen beliebigen externen Befehl) verwendenexecve()
, rufen Sie den Linker und den Loader auf (wenn gemeinsam genutzte Bibliotheken verwendet werden, was normalerweise der Fall ist) usw.