Bỏ qua 3 byte đầu tiên của tệp


11

Tôi đang sử dụng vỏ AIX 6.1 ksh.

Tôi muốn sử dụng một lớp lót để làm một cái gì đó như thế này:

cat A_FILE | skip-first-3-bytes-of-the-file

Tôi muốn bỏ qua 3 byte đầu tiên của dòng đầu tiên; Có cách nào để làm việc này không?

Câu trả lời:


18

Trường học cũ - bạn có thể sử dụng dd:

dd if=A_FILE bs=1 skip=3

Tệp đầu vào là A_FILE, kích thước khối là 1 ký tự (byte), bỏ qua 3 'khối' (byte) đầu tiên. (Với một số biến thể ddnhư GNU dd, bạn có thể sử dụng bs=1cở đây - và các lựa chọn thay thế như bs=1kđọc trong các khối 1 kilobyte trong các trường hợp khác. Có ddvẻ như AIX không hỗ trợ điều này cnhưng không hỗ trợ k, m, g, vv)

Cũng có những cách khác để đạt được kết quả tương tự:

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

Điều này hoạt động nếu có 3 ký tự trở lên trên dòng đầu tiên.

tail -c +4 A_FILE

Và bạn có thể sử dụng Perl, Python và như vậy.


Cảm ơn bạn đã giúp đỡ. Cả hai lệnh sed và tail đều hoạt động trong AIX 6.1. Đối với lệnh dd, nó phải dd if=A_FILE bs=1 skip=3ở AIX 6.1
Alvin SIU

Bạn có thể muốn sử dụng đầu vào tiêu chuẩn như con mèo A_FILE | đuôi -c +4 với gnu.
MUY Bỉ

14

Thay vì sử dụng, catbạn có thể sử dụng tailnhư vậy:

tail -c +4 FILE

Điều này sẽ in ra toàn bộ tập tin ngoại trừ 3 byte đầu tiên. Tư vấn man tailđể biết thêm thông tin.


Không biết về AIX, nhưng trên Solaris bạn phải sử dụng /usr/xpg4/bin/tail, ít nhất là trên máy của tôi. Mẹo tốt dù sao!
BellevueBob

1
@BobDuell Thật khó để đăng một cái gì đó tương thích với mọi hệ điều hành.
squiguy

Có, nó hoạt động trong AIX 6.1
Alvin SIU

@AlvinSIU Tốt để biết. Mừng vì tôi có thể giúp.
squiguy

0

Tôi cần phải làm gần đây một cái gì đó tương tự. Tôi đã giúp đỡ với một vấn đề hỗ trợ tại hiện trường và cần phải cho một kỹ thuật viên xem các lô thời gian thực khi họ đang thực hiện các thay đổi. Dữ liệu nằm trong nhật ký nhị phân phát triển suốt cả ngày. Tôi có phần mềm có thể phân tích cú pháp và vẽ dữ liệu từ nhật ký, nhưng hiện tại nó không phải là thời gian thực. Những gì tôi đã làm là nắm bắt kích thước của nhật ký trước khi tôi bắt đầu xử lý dữ liệu, sau đó đi vào một vòng lặp sẽ xử lý dữ liệu và mỗi lần tạo một tệp mới với các byte của tệp chưa được xử lý.

#!/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

Nếu chỉ bởi vì tôi đang ở trong tâm trạng đó, và không thích mã hóa theo đầu ra của ls; Bạn đã cân nhắc sử dụng stat -c'%s' "${IFILE}"thay vì ls|awkkết hợp đó chưa? Đó là, giả sử
lõi core

0

Nếu một người có Python trên hệ thống của họ, người ta có thể sử dụng tập lệnh python nhỏ để tận dụng seek()chức năng để bắt đầu đọc ở byte thứ n như vậy:

#!/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())

Và việc sử dụng sẽ như vậy:

$ ./skip_bytes.py input.txt 3

Lưu ý rằng số byte bắt đầu từ 0 (do đó byte đầu tiên thực sự là chỉ số 0), do đó bằng cách chỉ định 3 chúng tôi định vị hiệu quả việc đọc để bắt đầu ở 3 + 1 = byte thứ 4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.