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?¿Cómo obtener la primera línea de un archivo en un script bash?
Respuesta
head
toma las primeras líneas de un archivo, y el parámetro -n
puede usarse para especificar el número de líneas que debe extraerse:
line=$(head -n 1 filename)
line=$(head -1 file)
no tendrán ningún problema. (Como respuesta anterior). Pero
line=$(read -r FIRSTLINE < filename)
habrá marginalmente más rápido que read
es un comando incorporado en bash.
El segundo método no funciona como está escrito , porque 'leer' no imprime nada (entonces' line' termina en blanco), y también se ejecuta en una subcadena (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: simplemente use 'read -r line
para leer la primera línea usando bash, use la instrucción read
. por ejemplo
read -r firstline<file
firstline
será su variable (No hay necesidad de asignar a otro)
intentado con' cat ... | lea -r VAR' y falla :( – sorin
¿Cómo lee la segunda línea? – qed
@sorin, 'cat ... | read VAR' fallará en la mayoría de shells (excepto' zsh', por lo que sé) porque cada uno de los componentes de una tubería se ejecutará en subcapas separadas, lo que significa que '$ VAR' se establecerá en subshell (que dejará de existir tan pronto como la tubería haya terminado de ejecutarse) en lugar de en la capa invocadora. Puede evitar esto con 'leer VAR << EOF \ n $ (cat ...) \ nEOF' (donde cada' \ n' es una nueva línea). – zrajm
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, use la sintaxis var=$(command)
. 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)
.
Ver una muestra cuando damos de comer al 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' logi c e impiden leer más en el archivo. Como solo queremos la primera línea, alternativamente podemos hacer trampa con 'sed q' o' awk '1; {exit}'' o incluso 'grep -m1 ^' (menos código, la misma lógica esencial). (Esta no es una respuesta a la consulta de downvote.) –
@ AdamKatz es una muy buena serie de formas, ¡gracias! Encuentro el que tiene 'grep' muy inteligente. Por supuesto, también podemos decir 'head -n 1 file'. – fedorqui
Sí, 'head -n1' será más rápido (binario más pequeño para cargar) y' read' será más rápido (no binario para cargar, eso es un builtin). Me gusta especialmente 'grep -m1 --color .' cuando estoy imprimiendo la primera línea porque también coloreará la línea, lo que lo hace ideal para los encabezados de las tablas. –
La pregunta no le preguntó que es más rápido, pero para agregar para la respuesta sed, -n '1p' está funcionando mal ya que el espacio del patrón aún se escanea en archivos grandes. Por curiosidad he encontrado que 'cabeza' gana más estrecho SED:
# 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
Sólo echo
la primera lista de su archivo de origen en el archivo de destino.
echo $(head -n 1 source.txt) > target.txt
Para lo cual 'head -n 1 source.txt> target.txt' logrará exactamente lo mismo. – YoYo
- 1. Obtener el directorio de un archivo de script bash en
- 2. Bash- ¿cómo leer la penúltima línea de un archivo?
- 3. SVN: ¿cómo obtener la primera revisión de un archivo?
- 4. ¿Cómo ejecutar script bash línea por línea?
- 5. Cómo leer solo la primera línea de un archivo
- 6. Script de Unix para eliminar la primera línea de un archivo CSV
- 7. Leyendo la primera línea de un archivo en Ruby
- 8. ¿Cómo obtener la primera línea de texto de un M-archivo de Matlab?
- 9. ¿por qué la línea #!/Bin/ksh es la primera línea en un script de shell
- 10. ¿Cómo obtener la primera letra en una variable de Bash?
- 11. ¿Leer solo la primera línea de un archivo?
- 12. Cómo analizar un archivo CSV en Bash?
- 13. Variables de script de bash en línea
- 14. ejecutando un script bash desde un archivo make
- 15. ¿Cómo ejecuto un script bash en Terminal?
- 16. Generando un script bash con echo, problema con shebang línea
- 17. Eliminar la primera línea de archivo si está vacía
- 18. Ejecutar un script bash desde un script R
- 19. Validación de parámetros en un script Bash
- 20. Prueba de un script de shell bash
- 21. Leer líneas a partir de un número de línea en un script bash
- 22. ¿Cómo puedo hacer cambios solo en la primera línea de un archivo?
- 23. Cómo convertir DOS/Windows nueva línea (CRLF) a Unix nueva línea (\ n) en un script Bash?
- 24. ¿Cómo obtener la primera línea de String en Ruby?
- 25. ¿Cómo sé el nombre del archivo de script en un script Bash?
- 26. línea de ejecución del archivo en bash
- 27. Código de trabajo de Bash para eliminar la primera o la última línea del archivo
- 28. Mostrar la primera línea de un párrafo
- 29. Uso de la "pantalla alternativa" en un script bash
- 30. ¿Cómo ejecutas SQL desde un script bash?
Significativamente más gastos generales que el enfoque de 'lectura '. '$()' sobrescribe una subcadena, y el uso de un comando externo (* cualquier * comando externo) significa que está llamando a 'execve()', invocando el enlazador y el cargador (si usa bibliotecas compartidas, que generalmente es el caso), etc. –
Podría ser aún más corto: 'line =" $ (head -1 FILENAME) "' – nikolay
Y también: 'line = \' head -1 FILENAME \ ' –