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
headtoma las primeras líneas de un archivo y el -nparámetro se puede usar para especificar cuántas líneas se deben extraer:
line=$(head -n 1 filename)
readenfoque.$()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
readdeclaración. p.ejfirstlineserá tu variable (No es necesario asignarla a otra)fuente
cat ... | read VARfallará en la mayoría de los shells (todos exceptozshhasta donde yo sé) porque cada uno de los componentes de una tubería se ejecutará en subshells separados. Lo que significa que$VARse 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\nes una nueva línea).cates pura sobrecarga; mucho más eficiente queread -r var <filedecat file | readtodos 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
filenameen la variable$line:También me gusta
awkpara 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
readconseq 10, es decir, una secuencia de números del 1 al 10:fuente
sed '1!d;q'(osed -n '1p;q') imitará suawklógica y evitará leer más en el archivo. Debido a que sólo queremos la primera línea, podemos engañar, alternativamente, consed qoawk '1;{exit}'ni siquieragrep -m1 ^(menos código, la misma lógica esencial). (Esta no es una respuesta a la consulta de voto negativo.)grepmuy inteligente. Por supuesto, también podemos decirhead -n 1 file.head -n1será más rápido (binario más pequeño para cargar) yreadserá 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
reades un comando bash incorporado.fuente
readno imprime nada (por lo quelinetermina en blanco), y también se ejecuta en una subshell (por lo queFIRSTLINEse 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 <filenameSolo
echola primera lista de su archivo fuente en su archivo de destino.fuente
head -n 1 source.txt > target.txtlogrará 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