Что такое утилита `head` в Linux и как реализовать её аналог на Go?

Ответ

Что такое head?

head — это стандартная консольная утилита в Unix-подобных системах (например, Linux), которая выводит первые N строк из файла или потока данных. По умолчанию она выводит первые 10 строк.

Реализация аналога на Go

В Go можно легко реализовать аналогичную функциональность, что полезно при создании собственных CLI-инструментов или для обработки файлов внутри приложения без вызова внешних команд. Это делает ваше приложение кроссплатформенным и избавляет от внешних зависимостей.

Пример кода:

package main

import (
    "bufio"
    "fmt"
    "os"
)

// head выводит первые N строк из файла
func head(filename string, lines int) error {
    file, err := os.Open(filename)
    if err != nil {
        return fmt.Errorf("не удалось открыть файл: %w", err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    lineCount := 0
    for scanner.Scan() {
        if lineCount >= lines {
            break
        }
        fmt.Println(scanner.Text())
        lineCount++
    }

    return scanner.Err()
}

func main() {
    if len(os.Args) < 2 {
        fmt.Println("Использование: go run main.go <имя_файла>")
        return
    }
    err := head(os.Args[1], 10)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Ошибка: %vn", err)
    }
}

Ключевые моменты реализации:

  • os.Open(): Открывает файл для чтения.
  • bufio.Scanner: Эффективно считывает данные из файла построчно, не загружая весь файл в память.
  • Цикл for: Считывает строки до тех пор, пока не будет достигнут лимит lines или конец файла.
  • defer file.Close(): Гарантирует, что файл будет закрыт после завершения работы функции.