Ich muss die erste Zeile einer Datei in eine Bash-Variable einfügen. Ich denke, es ist mit dem Befehl grep, aber ist es eine Möglichkeit, die Anzahl der Zeilen zu beschränken?
249
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)
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.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.Bfirstline
wird Ihre Variable sein (keine Notwendigkeit, einem anderen zuzuweisen)quelle
cat ... | read VAR
wird in den meisten Shells fehlschlagen (alle außerzsh
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 mitread VAR <<EOF\n$(cat ...)\nEOF
(wobei jede\n
eine neue Zeile ist).cat
ist reiner Overhead; viel effizienterread -r var <file
alscat 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
:Ich mag auch
awk
dafür:Verwenden Sie die
var=$(command)
Syntax, um die Zeile selbst zu speichern . In diesem Fallline=$(awk 'NR==1 {print; exit}' file)
.Oder sogar
sed
:Mit dem Äquivalent
line=$(sed -n '1p' file)
.Sehen Sie sich ein Beispiel an, wenn wir das
read
mitseq 10
einer Zahlenfolge von 1 bis 10 füttern :quelle
sed '1!d;q'
(odersed -n '1p;q'
) ahmt Ihreawk
Logik nach und verhindert, dass Sie weiter in die Datei lesen. Da wir nur die erste Zeile wollen, können wir alternativ mitsed q
oderawk '1;{exit}'
oder sogar betrügengrep -m1 ^
(weniger Code, dieselbe wesentliche Logik). (Dies ist keine Antwort auf die Downvote-Anfrage.)grep
sehr klug. Das können wir natürlich auch sagenhead -n 1 file
.head -n1
wird schneller sein (kleinere Binärdatei zum Laden) undread
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.Wird gut funktionieren. (Wie vorherige Antwort). Aber
wird geringfügig schneller sein als
read
ein eingebauter Bash-Befehl.quelle
read
sie nichts druckt (wird alsoline
leer) und auch in einer Unterschale ausgeführt (wird alsoFIRSTLINE
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
Nur
echo
die erste Liste Ihrer Quelldatei in Ihre Zieldatei.quelle
head -n 1 source.txt > target.txt
wird genau das gleiche erreichen.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:
quelle