Tengo que poner en una variable bash la primera línea de un archivo. Supongo que es con el comando grep, pero ¿hay alguna forma de restringir el número de líneas?
249
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)
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.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.ejfirstline
será tu variable (No es necesario asignarla a otra)fuente
cat ... | read VAR
fallará en la mayoría de los shells (todos exceptozsh
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 conread VAR <<EOF\n$(cat ...)\nEOF
(donde cada uno\n
es una nueva línea).cat
es pura sobrecarga; mucho más eficiente queread -r var <file
decat 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
:También me gusta
awk
para esto:Para almacenar la línea en sí, use la
var=$(command)
sintaxis. En este casoline=$(awk 'NR==1 {print; exit}' file)
,.O incluso
sed
:Con el equivalente
line=$(sed -n '1p' file)
.Vea una muestra cuando alimentamos
read
conseq 10
, es decir, una secuencia de números del 1 al 10:fuente
sed '1!d;q'
(osed -n '1p;q'
) imitará suawk
lógica y evitará leer más en el archivo. Debido a que sólo queremos la primera línea, podemos engañar, alternativamente, consed q
oawk '1;{exit}'
ni siquieragrep -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 decirhead -n 1 file
.head -n1
será más rápido (binario más pequeño para cargar) yread
será más rápido (sin binario para cargar, eso es algo incorporado). Me gusta especialmentegrep -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.Funcionará bien (Como respuesta anterior). Pero
será marginalmente más rápido como lo
read
es un comando bash incorporado.fuente
read
no imprime nada (por lo queline
termina en blanco), y también se ejecuta en una subshell (por lo queFIRSTLINE
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
Solo
echo
la primera lista de su archivo fuente en su archivo de destino.fuente
head -n 1 source.txt > target.txt
logrará exactamente lo mismo.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:
fuente