На Linux (не BusyBox), Солярис, NetBSD, OpenBSD: usermod -g group
Команда usermod изменяет системные файлы учетной записи для отражения изменений, которые указаны на командной строке
- g, - ГРУППА ценуроза
Название группы или число пользователей новая начальная группа входа в систему. Группа должна существовать. Любой файл из пользовательского корневого каталога, принадлежавшего предыдущей основной группе пользователя, будет принадлежать этой новой группе.
Владение группы файлов за пределами пользовательского корневого каталога должно быть зафиксировано вручную.
На FreeBSD: pw usermod -g group
На BusyBox: addgroup -g user group
Вы не сможете сделать это без полномочий пользователя root.
Старая школа — Вы могли использовать 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 и так далее также.
Вместо использования cat
можно использовать tail
как таковой:
tail -c +4 FILE
Это распечатает весь файл за исключением первых 3 байтов. Консультироваться man tail
для получения дополнительной информации.
/usr/xpg4/bin/tail
, по крайней мере, на моей машине. Хороший совет, тем не менее!
– BellevueBob
24.10.2012, 22:34
Мне недавно нужно было сделать что-то подобное. Я помогал с проблемой полевой поддержки, и мне нужно было, чтобы технический специалист видел графики в реальном времени, когда они вносили изменения. Данные хранятся в двоичном журнале, который увеличивается в течение дня. У меня есть программное обеспечение, которое может анализировать и отображать данные из журналов, но в настоящее время это не в реальном времени. Что я сделал, так это зафиксировал размер журнала до того, как я начал обрабатывать данные, затем вошел в цикл, который обрабатывал данные, и каждый проход создавал новый файл с байтами файла, который еще не был обработан.
#!/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
Если в системе установлен 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-й байт
dd if=A_FILE bs=1 skip=3
в AIX 6.1 – Alvin SIU 25.10.2012, 16:55