${string:offset:length}
es un operador de expansión de parámetros que se expande al rango de caracteres en la variable $string
.
Para obtener un rango de bytes de la entrada (y eso también se aplicaría a caracteres de un solo -byte ), puede usar:
func | tail -c +12 | head -c 5
para obtener 5 bytes comenzando con el 12 (1 -compensaciones basadas ). La opción -c
a head
no es estándar pero es bastante común.
Tenga en cuenta que func
puede eliminarse en algún momento después de que haya generado su byte 16, ya que head
saldrá después de haber generado esos 5 bytes, y tail
sería eliminado si intenta escribir más datos después de eso, que se extendería a func
.
También puedes hacer:
func | dd bs=1 skip=11 count=5 2> /dev/null
2> /dev/null
es para evitar el mensaje de estado al final. Sin embargo, eso suprime todos los errores. Con GNU dd
, puede reemplazarlo con status=none
para suprimir solo el estado.
Para valores grandes de length
, eso sería menos eficiente ya que lee un byte a la vez. Con GNU dd
nuevamente, puede evitar eso haciendo:
func | dd iflag=count_bytes,skip_bytes,fullblock skip=11 bs=64k count=5M status=none
Lo que haría tantas lecturas de hasta 64KiB cada una para obtener 5MiB bytes de datos.
Ahora, para que el desplazamiento y la longitud se expresen en caracteres (uno o varios -bytes )en lugar de bytes, eso se vuelve más complicado.
Una opción es almacenar toda la salida en una variable y usar el ${var:offset:length}
operador como otros han mostrado . Aunque eso significa almacenar toda la salida en la memoria. Usar var=$(func)
también significa que los caracteres finales de nueva línea se descartan.
Otra opción es usar bash
's read -N
que lee un número dado de caracteres:
func | {
IFS= read -rN 11 discarded
IFS= read -rN 5 data
printf '%s\n' "$data"
}
O conperl
(un poco más eficiente para grandes datos):
func | perl -Mopen=locale -sne '
BEGIN{$total = $o + $n; $/ = \$total}
print substr($_, $o); exit' -- -o=10000 -n=5000000
Вы можете использовать команду find
с аргументом -inum
с номером инода, как показано ниже
Пример-
touch /home/ajeet/original_file.txt
ln /home/ajeet/original_file.txt /root/hard_link_file.txt
ls -li /root/hard_link_file.txt
1704088 -rw-r--r-- 2 root root 0 May 24 18:24 /root/hard_link_file.txt
ls -li /home/ajeet/original_file.txt
1704088 -rw-r--r-- 2 root root 0 May 24 18:24 /home/ajeet/original_file.txt
find / -inum 1704088
/home/ajeet/original_file.txt
/root/hard_link_file.txt