Log Chunk

import argparse
import os
import sys


def truncate_filename(filename: str, max_length: int = 16) -> str:
    """
    Truncate filename (without extension) to max_length characters.
    """
    base = os.path.basename(filename)
    name, _ = os.path.splitext(base)
    return name[:max_length]


def extract_chunk(source_file: str, start: int, number: int) -> str:
    """
    Extract a chunk of lines from source_file starting at 'start'
    and taking 'number' lines.
    Returns the output file name.
    """
    if start < 0:
        raise ValueError("Start line cannot be negative")
    if number <= 0:
        raise ValueError("Number of lines must be positive")

    output_base = truncate_filename(source_file)
    output_file = f"chunk-{output_base}.log"

    with open(source_file, "r", encoding="utf-8", errors="replace") as src:
        with open(output_file, "w", encoding="utf-8") as dst:
            for current_line_number, line in enumerate(src):
                if current_line_number < start:
                    continue
                if current_line_number >= start + number:
                    break
                dst.write(line)

    return output_file


def main():
    parser = argparse.ArgumentParser(
        description="Extract a chunk of lines from a log file."
    )

    parser.add_argument(
        "logfile",
        help="Path to the source log file"
    )

    parser.add_argument(
        "-s", "--start",
        type=int,
        default=0,
        help="Start line (0-based). Default: 0"
    )

    parser.add_argument(
        "-n", "--number",
        type=int,
        default=100,
        help="Number of lines to extract. Default: 100"
    )

    args = parser.parse_args()

    if not os.path.isfile(args.logfile):
        print(f"Error: File not found: {args.logfile}", file=sys.stderr)
        sys.exit(1)

    try:
        output_file = extract_chunk(args.logfile, args.start, args.number)
        print(f"Chunk written to: {output_file}")
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()