Пропустите первые 3 байта файла

На Linux (не BusyBox), Солярис, NetBSD, OpenBSD: usermod -g group

Команда usermod изменяет системные файлы учетной записи для отражения изменений, которые указаны на командной строке

- g, - ГРУППА ценуроза

Название группы или число пользователей новая начальная группа входа в систему. Группа должна существовать. Любой файл из пользовательского корневого каталога, принадлежавшего предыдущей основной группе пользователя, будет принадлежать этой новой группе.

Владение группы файлов за пределами пользовательского корневого каталога должно быть зафиксировано вручную.

На FreeBSD: pw usermod -g group

На BusyBox: addgroup -g user group

Вы не сможете сделать это без полномочий пользователя root.

10
04.02.2017, 01:58
4 ответа

Старая школа — Вы могли использовать dd:

dd if=A_FILE bs=1 skip=3

Входной файл A_FILE, размер блока является 1 символом (байт), пропустите первые 3 'блока' (байты). (С некоторыми вариантами dd такой как GNU dd, Вы могли использовать bs=1c здесь — и альтернативы как bs=1k читать в блоках 1 килобайта при других обстоятельствах. dd на AIX не поддерживает это, это кажется; BSD (macOS Горная цепь) вариант не поддерживает c но действительно поддерживает k, m, g, и т.д.)

Существуют другие способы достигнуть того же результата, также:

sed '1s/^...//' A_FILE

Это работает, если существует 3 или больше символа на первой строке.

tail -c +4 A_FILE

И Вы могли использовать Perl, Python и так далее также.

17
27.01.2020, 19:59
  • 1
    спасибо за Вашу справку. И sed и хвост управляют работой в AIX 6.1. Для команды dd это должно быть dd if=A_FILE bs=1 skip=3 в AIX 6.1 –  Alvin SIU 25.10.2012, 16:55
  • 2
    Можно хотеть использовать кошку входа стандарта как таковую A_FILE | хвост-c +4 с гну. –  MUY Belgium 08.11.2013, 09:57

Вместо использования cat можно использовать tail как таковой:

tail -c +4 FILE

Это распечатает весь файл за исключением первых 3 байтов. Консультироваться man tail для получения дополнительной информации.

14
27.01.2020, 19:59
  • 1
    Не знайте о AIX, но на Солярисе необходимо использовать /usr/xpg4/bin/tail, по крайней мере, на моей машине. Хороший совет, тем не менее! –  BellevueBob 24.10.2012, 22:34
  • 2
    @BobDuell трудно отправить что-то, что совместимо с каждой ОС. –  squiguy 24.10.2012, 23:10
  • 3
    Да, это работает в AIX 6.1 –  Alvin SIU 25.10.2012, 16:54
  • 4
    @AlvinSIU, Хорошего знать. Довольный я мог помочь. спасибо –  squiguy 25.10.2012, 18:43

Мне недавно нужно было сделать что-то подобное. Я помогал с проблемой полевой поддержки, и мне нужно было, чтобы технический специалист видел графики в реальном времени, когда они вносили изменения. Данные хранятся в двоичном журнале, который увеличивается в течение дня. У меня есть программное обеспечение, которое может анализировать и отображать данные из журналов, но в настоящее время это не в реальном времени. Что я сделал, так это зафиксировал размер журнала до того, как я начал обрабатывать данные, затем вошел в цикл, который обрабатывал данные, и каждый проход создавал новый файл с байтами файла, который еще не был обработан.

#!/usr/bin/env bash

# I named this little script hackjob.sh
# The purpose of this is to process an input file and load the results into
# a database. The file is constantly being update, so this runs in a loop
# and every pass it creates a new temp file with bytes that have not yet been
# processed.  It runs about 15 seconds behind real time so it's
# pseudo real time.  This will eventually be replaced by a real time
# queue based version, but this does work and surprisingly well actually.

set -x

# Current data in YYYYMMDD fomat
DATE=`date +%Y%m%d`

INPUT_PATH=/path/to/my/data
IFILE1=${INPUT_PATH}/${DATE}_my_input_file.dat

OUTPUT_PATH=/tmp
OFILE1=${OUTPUT_PATH}/${DATE}_my_input_file.dat

# Capture the size of the original file
SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`

# Copy the original file to /tmp
cp ${IFILE1} ${OFILE1}

while :
do
    sleep 5

    # process_my_data.py ${OFILE1}
    rm ${OFILE1}
    # Copy IFILE1 to OFILE1 minus skipping the amount of data already processed
    dd skip=${SIZE1} bs=1 if=${IFILE1} of=${OFILE1}
    # Update the size of the input file
    SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`

    echo

    DATE=`date +%Y%m%d`

done
0
27.01.2020, 19:59

Если в системе установлен Python, можно использовать небольшой скрипт Python, чтобы воспользоваться функцией seek () , чтобы начать чтение с n-й байт выглядит так:

#!/usr/bin/env python3
import sys
with open(sys.argv[1],'rb') as fd:
    fd.seek(int(sys.argv[2]))
    for line in fd:
        print(line.decode().strip())

И использование будет таким:

$ ./skip_bytes.py input.txt 3

Обратите внимание, что счетчик байтов начинается с 0 (таким образом, первый байт на самом деле является индексом 0), таким образом, указав 3, мы эффективно позиционируем чтение, чтобы начать с 3 + 1 = 4-й байт

0
27.01.2020, 19:59

Теги

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