Respuestas:
head
toma las primeras líneas de un archivo y el -n
parámetro se puede usar para especificar cuántas líneas se deben extraer:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
abrir una subshell como lo $()
hace?
$()
sintaxis es más fácil de ver y valoro la claridad en lugar de la absoluta terquedad. gnu.org/software/bash/manual/html_node/…
para leer la primera línea usando bash, use la read
declaración. p.ej
read -r firstline<file
firstline
será tu variable (No es necesario asignarla a otra)
cat ... | read VAR
fallará en la mayoría de los shells (todos excepto zsh
hasta donde yo sé) porque cada uno de los componentes de una tubería se ejecutará en subshells separados. Lo que significa que $VAR
se establecerá en el subshell (que dejará de existir tan pronto como la canalización haya terminado de ejecutarse) en lugar de en el shell de invocación. Puede evitar esto con read VAR <<EOF\n$(cat ...)\nEOF
(donde cada uno \n
es una nueva línea).
cat
es pura sobrecarga; mucho más eficiente que read -r var <file
de cat file | read
todos modos, incluso si este último no falla por las razones descritas en BashFAQ # 24 .
cat
, entoncesread -r var < <(otherprog ...)
Esto es suficiente y almacena la primera línea de filename
en la variable $line
:
read -r line < filename
También me gusta awk
para esto:
awk 'NR==1 {print; exit}' file
Para almacenar la línea en sí, use la var=$(command)
sintaxis. En este caso line=$(awk 'NR==1 {print; exit}' file)
,.
O incluso sed
:
sed -n '1p' file
Con el equivalente line=$(sed -n '1p' file)
.
Vea una muestra cuando alimentamos read
con seq 10
, es decir, una secuencia de números del 1 al 10:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(o sed -n '1p;q'
) imitará su awk
lógica y evitará leer más en el archivo. Debido a que sólo queremos la primera línea, podemos engañar, alternativamente, con sed q
o awk '1;{exit}'
ni siquiera grep -m1 ^
(menos código, la misma lógica esencial). (Esta no es una respuesta a la consulta de voto negativo.)
grep
muy inteligente. Por supuesto, también podemos decir head -n 1 file
.
head -n1
será más rápido (binario más pequeño para cargar) y read
será más rápido (sin binario para cargar, eso es algo incorporado). Me gusta especialmente grep -m1 --color .
cuando solo estoy imprimiendo la primera línea porque también coloreará la línea, por lo que es ideal para los encabezados de las tablas.
line=$(head -1 file)
Funcionará bien (Como respuesta anterior). Pero
line=$(read -r FIRSTLINE < filename)
será marginalmente más rápido como lo read
es un comando bash incorporado.
read
no imprime nada (por lo que line
termina en blanco), y también se ejecuta en una subshell (por lo que FIRSTLINE
se establece en la primera línea, pero solo en la subshell, por lo que no está disponible después). Solución: solo useread -r line <filename
La pregunta no pregunta cuál es la más rápida, pero para agregar a la respuesta sed, -n '1p' está funcionando mal ya que el espacio del patrón todavía se escanea en archivos grandes. Por curiosidad descubrí que 'head' gana a sed por poco:
# 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
enfoque.$()
bifurca un subnivel, y utilizando un comando externo ( cualquier comando externo) significa que está llamandoexecve()
, invocando el enlazador y el cargador (si se trata de utilizar las bibliotecas compartidas, que suele ser el caso), etc.