¿Existe un comando como cat
en Linux que pueda devolver una cantidad específica de caracteres de un archivo?
por ejemplo, tengo un archivo de texto como:
Hello world
this is the second line
this is the third line
Y quiero algo que devuelva los primeros 5 caracteres, que sería "hola".
Gracias
linux
command-line
pbreault
fuente
fuente
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
también consume lo" world\n"
que se pierde para siempre.Respuestas:
head
también funciona:.. extraerá los primeros 100 bytes y los devolverá.
Lo bueno de usar
head
para esto es que la sintaxis paratail
coincidencias:Puede combinarlos para obtener rangos de bytes. Por ejemplo, para obtener los segundos 100 bytes de un archivo, lea los primeros 200 con
head
y use tail para obtener los últimos 100:fuente
head
, luego usetail
para obtener los últimos 10, por ejemplo:head -c 20 file | tail -c 10
Puede utilizar dd para extraer trozos arbitrarios de bytes.
Por ejemplo,
copiaría los bytes 1235 a 1239 de su entrada a su salida y descartaría el resto.
Para obtener los primeros cinco bytes de la entrada estándar, haga lo siguiente:
Tenga en cuenta que, si desea especificar el nombre del archivo de entrada, dd tiene un análisis de argumentos anticuado, por lo que debería hacer:
Tenga en cuenta también que dd anuncia detalladamente lo que hizo, por lo que para descartarlo, haga lo siguiente:
o
fuente
dd bs=1
obliga a dd a leer y escribir un solo carácter a la vez, lo que es mucho más lento quehead
cuando el recuento es grande. Sin embargo, no se nota para count = 5.dd
, al parecer, funcionará ... ¡Salud!head -c
implementar eldd bs=5 count=1
enfoque funcionócabeza :
Nombre
head: genera la primera parte de los archivos
Sinopsis
cabeza [ OPCIÓN ] ... [ ARCHIVO ] ...
Descripción
Imprima las primeras 10 líneas de cada ARCHIVO en salida estándar. Con más de un ARCHIVO, preceda a cada uno con un encabezado que indique el nombre del archivo. Sin FILE, o cuando FILE es -, lea la entrada estándar.
Los argumentos obligatorios para las opciones largas también son obligatorios para las opciones cortas.
-c , --bytes = [-] N imprime los primeros N bytes de cada archivo; con el '-' inicial, imprime todos menos los últimos N bytes de cada archivo
fuente
la cabeza o la cola también pueden hacerlo:
Imprime los primeros X bytes (no necesariamente caracteres si es un archivo UTF-16) del archivo. tail hará lo mismo, excepto por los últimos X bytes.
Esto (y el corte) son portátiles.
fuente
este script proporciona el número exacto de caracteres de la línea y ubicación específicas, por ejemplo:
da los caracteres en la línea 5 y los caracteres 5 a 8 de la línea 5,
Nota :
tail -1
se utiliza para seleccionar la última línea mostrada por el encabezado.fuente
también puede grep de la línea y luego cortarla como, por ejemplo:
grep 'texto' nombre de archivo | cortar -c 1-5
fuente
Sé que la respuesta es en respuesta a una pregunta hecha hace 6 años ...
Pero estuve buscando algo similar durante unas horas y luego descubrí que: cut -c hace exactamente eso, con una ventaja adicional de que también podría especificar un desplazamiento.
cut -c 1-5 devolverá Hello y cut -c 7-11 devolverá world . No necesita ningún otro comando
fuente
Aunque esto fue respondido / aceptado hace años, la respuesta actualmente aceptada solo es correcta para codificaciones de un byte por carácter como iso-8859-1, o para los subconjuntos de un byte de conjuntos de caracteres de bytes variables (como caracteres latinos dentro de UTF-8). Incluso el uso de empalmes de varios bytes en su lugar solo funcionaría para codificaciones fijas de varios bytes como UTF-16. Dado que ahora UTF-8 está en camino de convertirse en un estándar universal, y al mirar esta lista de idiomas por número de hablantes nativos y esta lista de los 30 idiomas principales por uso nativo / secundario , es importante señalar un Técnica simple y amigable con los caracteres de bytes variables (no basada en bytes), usando
cut -c
ytr
/sed
con clases de caracteres.Compare lo siguiente que falla doblemente debido a dos errores / presunciones comunes centrados en el latín con respecto al problema de bytes frente a caracteres (uno es
head
vs.cut
, el otro es[a-z][A-Z]
vs.[:upper:][:lower:]
):a esto (nota: esto funcionó bien en FreeBSD, pero ambos
cut
ytr
en GNU / Linux todavía destrozaron el griego en UTF-8 para mí):Si
cut
no maneja-c
correctamente las codificaciones de bytes variables, para "los primerosX
caracteres" (reemplaceX
con su número) puede intentar:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- que se limita a la primera línea, aunquehead -n 1 | grep -E -o '^.{X}'
- que se limita a la primera línea y encadena dos comandos aunquedd
- que ya se sugirió en otras respuestas, pero es realmente engorrososed
script complicado con búfer de ventana deslizante para manejar caracteres repartidos en varias líneas, pero que probablemente sea más engorroso / frágil que simplemente usar algo comodd
Si
tr
no maneja correctamente las clases de caracteres con codificaciones de bytes variables, puede intentar:sed -E -e 's/[[:upper:]]/\L&/g
(Específico de GNU)fuente
printf 'Πού ' | cut -c 1
solo devuelve galimatías ... se comporta como 'cabeza'Aquí hay un script simple que concluye usando el
dd
enfoque mencionado aquí:extract_chars.sh
fuente