linux - programacion - scripts bash ejemplos
Imprime un archivo saltando las primeras X lĂneas en Bash (13)
Tengo un archivo muy largo que quiero imprimir, pero omitiendo las primeras líneas 1e6, por ejemplo. Miro la página del manual del gato, pero no vi ninguna opción para hacer esto. Estoy buscando un comando para hacer esto o un programa bash simple.
Este script de shell funciona bien para mí:
#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 ''{
if (NR >= initial_line && NR <= end_line)
print $0
}'' $3
Utilizado con este archivo de muestra (archivo.txt):
one
two
three
four
five
six
El comando (se extraerá de la segunda a la cuarta línea del archivo):
edu@debian5:~$./script.sh 2 4 file.txt
Salida de este comando:
two
three
four
Por supuesto, puede mejorarlo, por ejemplo, comprobando que todos los valores de argumento son los esperados :-)
La forma más fácil que encontré para eliminar las primeras diez líneas de un archivo:
$ sed 1,10d file.txt
Necesitaba hacer lo mismo y encontré este hilo.
Intenté "tail -n +, pero simplemente imprimí todo.
Las más + líneas funcionaron muy bien en el indicador, pero resultó que se comportó de manera totalmente diferente cuando se ejecutó en modo sin cabeza (cronjob).
Finalmente escribí esto yo mismo:
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
Necesitarás cola.
$ tail great-big-file.log
< Last 10 lines of great-big-file.log >
Si realmente necesita SKIP un número particular de líneas, use
$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >
Es decir, si desea omitir N líneas, comienza a imprimir la línea N + 1. Ejemplo:
$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >
Si solo desea ver las últimas líneas, omita el "+":
$ tail -n <N> <filename>
< last N lines of file. >
Puedes hacer esto usando los comandos de cabeza y cola:
head -n <num> | tail -n <lines to print>
donde num es 1e6 + el número de líneas que desea imprimir.
Si desea ver la primera línea de 10 puede usar sed como se muestra a continuación:
sed -n ''1,10 p'' myFile.txt
o si quieres ver líneas del 20 al 30 puedes usar:
sed -n ''20,30 p'' myFile.txt
Si tiene una cola GNU disponible en su sistema, puede hacer lo siguiente:
tail -n +1000001 huge-file.log
Es el personaje +
que hace lo que quieres. Para citar de la página man:
Si el primer carácter de K (el número de bytes o líneas) es un ''+'', imprima comenzando con el elemento Kth desde el inicio de cada archivo.
Por lo tanto, como se señaló en el comentario, poner +1000001 comienza a imprimir con el primer elemento después de las primeras 1,000,000 de líneas.
Solo para proponer una alternativa sed
. :) Para saltar el primer millón de líneas, pruebe |sed ''1,1000000d''
.
Ejemplo:
$ perl -wle ''print for (1..1_000_005)''|sed ''1,1000000d''
1000001
1000002
1000003
1000004
1000005
Una versión menos detallada con AWK:
awk ''NR > 1e6'' myfile.txt
Pero recomendaría usar números enteros.
Utilice el comando sed delete
con una dirección de rango . Por ejemplo:
$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.
Alternativamente, si solo desea imprimir un rango conocido, use el comando imprimir con la -n
:
$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt
Esta solución debería funcionar de manera confiable en todos los sistemas UNIX, independientemente de la presencia de las utilidades GNU.
si quieres saltarte la primera linea
tail -n +3 <filename>
si quieres saltarte la primera x linea
tail -n +$((x+1)) <filename>
cat < File > | awk ''{if(NR > 6) print $0}''
sed -n ''1d;p''
Este comando borrará la primera línea e imprimirá el resto.