From cd6f70d1fe8d55e46ae9e6ed83119719d596e6ea Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 20 Oct 2025 14:21:36 -0400 Subject: [PATCH] head and tail are working. --- head/.gitignore | 2 ++ head/Makefile | 4 ++++ head/go.mod | 3 +++ head/main.go | 43 +++++++++++++++++++++++++++++++++++++++++++ tail/.gitignore | 2 ++ tail/Makefile | 4 ++++ tail/go.mod | 3 +++ tail/main.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 108 insertions(+) create mode 100644 head/.gitignore create mode 100644 head/Makefile create mode 100644 head/go.mod create mode 100644 head/main.go create mode 100644 tail/.gitignore create mode 100644 tail/Makefile create mode 100644 tail/go.mod create mode 100644 tail/main.go diff --git a/head/.gitignore b/head/.gitignore new file mode 100644 index 0000000..2dc9786 --- /dev/null +++ b/head/.gitignore @@ -0,0 +1,2 @@ +head +head.exe diff --git a/head/Makefile b/head/Makefile new file mode 100644 index 0000000..bea7546 --- /dev/null +++ b/head/Makefile @@ -0,0 +1,4 @@ + + +build: + go build . diff --git a/head/go.mod b/head/go.mod new file mode 100644 index 0000000..8a9e717 --- /dev/null +++ b/head/go.mod @@ -0,0 +1,3 @@ +module lcthw.dev/go/go-coreutils/head + +go 1.25.3 diff --git a/head/main.go b/head/main.go new file mode 100644 index 0000000..d9e3bc4 --- /dev/null +++ b/head/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "bufio" + "os" + "log" + "flag" + "io" +) + +func HeadFile(file io.Reader, count int) { + scan := bufio.NewScanner(file) + + for cur_line := 0; scan.Scan(); cur_line++ { + line := scan.Text() + + if cur_line < count { + fmt.Println(line) + } + } + + if scan.Err() != nil { log.Fatal(scan.Err()) } +} + +func main() { + var count int + + flag.IntVar(&count, "n", 10, "number of lines") + flag.Parse() + + if flag.NArg() > 0 { + files := flag.Args() + for _, fname := range files { + file, err := os.Open(fname) + if err != nil { log.Fatal(err) } + + HeadFile(file, count) + } + } else { + HeadFile(os.Stdin, count) + } +} diff --git a/tail/.gitignore b/tail/.gitignore new file mode 100644 index 0000000..40933de --- /dev/null +++ b/tail/.gitignore @@ -0,0 +1,2 @@ +tail +tail.exe diff --git a/tail/Makefile b/tail/Makefile new file mode 100644 index 0000000..bea7546 --- /dev/null +++ b/tail/Makefile @@ -0,0 +1,4 @@ + + +build: + go build . diff --git a/tail/go.mod b/tail/go.mod new file mode 100644 index 0000000..4f61c08 --- /dev/null +++ b/tail/go.mod @@ -0,0 +1,3 @@ +module lcthw.dev/go/go-coreutils/tail + +go 1.25.3 diff --git a/tail/main.go b/tail/main.go new file mode 100644 index 0000000..9367906 --- /dev/null +++ b/tail/main.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "bufio" + "os" + "log" + "flag" + "io" +) + +func TailFile(file io.Reader, count int) { + scan := bufio.NewScanner(file) + var lines []string + + for scan.Scan() { + lines = append(lines, scan.Text()) + } + + if scan.Err() != nil { log.Fatal(scan.Err()) } + + start := len(lines) - count + if start < 0 { start = 0 } + + for line := int(start); line < len(lines); line++ { + fmt.Println(lines[line]) + } +} + +func main() { + var count int + + flag.IntVar(&count, "n", 10, "number of lines") + flag.Parse() + + if flag.NArg() > 0 { + files := flag.Args() + for _, fname := range files { + file, err := os.Open(fname) + if err != nil { log.Fatal(err) } + + TailFile(file, count) + } + } else { + TailFile(os.Stdin, count) + } +}