Как добавить строка, прочитанная из STDIN с отметкой времени эпохи? [дубликат]

Me gustaría compartir mi experiencia con este tema, en caso de que resulte útil para otro lector. Recientemente utilicé DDRESCUE para recuperar el primer tercio de una partición NTFS de un disco duro que no funcionaba bien y reconstruí con éxito el segmento recuperado de la partición en un disco duro más pequeño -, rescatando así los archivos capturados (y perdiendo el resto ). ¡Los siguientes son los pasos que tomé para hacerlo(definitivamente un enfoque HACKSAW!)...

El disco duro de origen constaba de 750 GB formateados en NTFS con una tabla de archivos MBR. Lo había usado solo unas pocas veces para hacer una copia de seguridad de los archivos, por lo que la mayoría de los archivos estaban al comienzo de la unidad, con un valor aproximado de 160 GB. Un miembro de la familia golpeó el disco duro (montado externamente )contra el piso -¡y nunca funcionó correctamente después de eso! Usando ddrescue (minuciosamente )pude recuperar una gran parte del comienzo de la unidad. Debido al daño físico, se apagó con mucha frecuencia durante todo el proceso...

Tenía un pequeño disco duro de computadora portátil disponible de 150 GB (montado externamente ), del cual extraje los datos de ddrescue directamente. Alternativamente, podría haber extraído los datos a un archivo de imagen y luego haber montado el archivo, sin embargo, pensé que escribir los datos directamente en un disco duro sería más sencillo.

El truco clave para el rescate fue editar manualmente los datos del sector de arranque MBR y NTFS en el disco duro de rescate. Sin hacerlo, ningún sistema operativo reconoce el disco duro. No pude encontrar un programa adecuado en Linux para hacerlo, así que recurrí a Windows. Hay un paquete útil llamado Herramientas de soporte de Windows, que ya no se mantiene, pero sigue siendo útil (, consulte el enlace a continuación ). La herramienta que utilicé para editar la partición es Disk Probe.Asegúrese de conocer el valor del sector final de su disco duro (Usé fdisk -l en Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Usando una buena calculadora y algo de creatividad, cargué y monté el disco duro en Disk Probe en Windows y edité los valores del sector final. En el MBR, se tuvieron que cambiar dos conjuntos de valores, a saber, a )el sector final del disco duro yb )el sector final de la partición NTFS. En el Sector de arranque NTFS, el valor de los Sectores totales de la partición tuvo que cambiarse. En cada caso, el valor numérico se redujo para igualar la "dimensión" reducida de los sectores finales del disco duro más pequeño (que cambió de 750 GB a 150 GB ). Haga clic en la pestaña Ver para editar estos valores.

Aquí hay una imagen de Disk Probe en acción editando los datos del sector de arranque NTFSWindows Support Tools - Disk Probe

Al editar los campos antes mencionados, Windows reconoció la partición como una partición válida aunque dañada. Entré en el símbolo del sistema y ejecuté el programa de Windows Chkdsk en el disco duro dañado (chdsk D :). ¡Fue emocionante ver cómo la partición volvía a la vida, archivo por archivo! El programa reconstruyó la tabla de particiones y reasignó con éxito todos los archivos que se habían copiado del disco duro dañado. Los archivos que estaban fuera de rango (no copiados )no se encontraron y, por lo tanto, se eliminaron.

No entiendo el motivo de la siguiente parte, ya que Windows reconstruyó con éxito el disco duro de 150 GB con los archivos incluidos. No obstante, Windows de forma nativa no pudo abrir la partición del disco duro para ver archivos (, hubo algún error ). Sin embargo, ¡Ubuntu al rescate! Reinicié Ubuntu, monté el disco duro externo y, sin ningún problema, ¡aparecieron todos los archivos recuperados!

Con suerte, este método de sierra para metales para recuperar archivos de un disco duro grande en un disco duro más pequeño resultará útil para otra pobre alma además de mí. ¡Salud!

1
23.05.2017, 15:40
3 ответа

Функция system() в awk запускает команду и возвращает ее статус. Вы получили 0, потому что команда выполнена успешно. Вывод date +'%s' печатался отдельно.

Чтобы получить вывод внешней команды, вы должны использовать getline():

$ echo foo bar baz | awk '{"date +%s" | getline d; printf "%s %s\n", d, $0}'
1491147643 foo bar baz

Нет ничего общего с OFS, потому что по умолчанию это пробел.


С помощью gawk или mawk вы также можете сделать:

echo foo bar baz | gawk '{printf "%s %s\n", systime(), $0}'

Функция systime() возвращает количество секунд с начала эпохи, не считая високосных секунд


IOW, вы можете сделать это в одиночку с помощью date:

date +'%s foo bar baz'
5
29.04.2021, 00:02

Это также можно сделать с помощью sed as

Код:

 echo 1 2 3 | sed 's/^/'`date +"%s"`' /'

Результаты:

1491148928 1 2 3
1
29.04.2021, 00:02

Баш
Здесь мы используем цикл whileдля приема аргументов из стандартного ввода и НЕ выполняем разделения, поскольку мы используем IFS=с read. Это позволяет сохранить всю строку с сопутствующими пробелами. И, наконец, мы echotimestampвместе с аргументами, которые теперь доступны через переменную $l. Следует иметь в виду, что все аргументы для echoдолжны быть заключены в кавычки для предсказуемого поведения кода.

echo 'foo     bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done

Перл

Опция

-nпредписывает Perlчитать строку файла -по строке -+ не печатать, если специально не попросят. Каждая прочитанная строка сохраняется в $_, что эквивалентно $0из awk. time()— это функция Perlbuiltin, дающая нам epochвремя. Затем мы помещаем время эпохи и текущую строку в ссылку на массив anonymous[...,... ]и возвращаем содержимое этого массива с помощью dereferencingit, @{... }Двойные кавычки "..."вокруг выражения @{...}гарантируют что элементы списка должны быть разделены пробелом. Затем мы их печатаем.

echo... |  perl -ne 'print "@{[+time,$_]}"'

IFS= read -r l <<<"$(echo 'foo    bar baz')"
printf '%d %s\n' "$(date +'%s')" "$l"
2
29.04.2021, 00:02

Теги

Похожие вопросы