Compare commits

..

4 Commits

Author SHA1 Message Date
80ec16a612 fix badge 2025-11-03 20:26:22 +01:00
fe600ffb66 catch io error 2025-11-03 20:22:32 +01:00
92d8017711 catch io error 2025-11-03 20:22:13 +01:00
5ca8b6c1cf moving to codeberg 2025-11-03 20:09:39 +01:00
16 changed files with 83 additions and 503 deletions

View File

@@ -66,4 +66,4 @@ release:
---
Full Changelog: [{{ .PreviousTag }}...{{ .Tag }}](https://codeberg.org/scip/tablizer/compare/{{ .PreviousTag }}...{{ .Tag }})
Full Changelog: [{{ .PreviousTag }}...{{ .Tag }}](https://codeberg.org/scip/epuppy/compare/{{ .PreviousTag }}...{{ .Tag }})

32
.woodpecker/image.yaml Normal file
View File

@@ -0,0 +1,32 @@
# https://woodpecker-ci.org/plugins/docker-buildx
# enable Package unit and go to /scip/-/packages after building to link to proj
variables:
- &repo codeberg.org/${CI_REPO_OWNER}/TEMPLATE
steps:
dryrun:
image: docker.io/woodpeckerci/plugin-docker-buildx:latest
settings:
dockerfile: Dockerfile
platforms: linux/amd64
dry_run: true
repo: *repo
tags: latest
when:
event: [pull_request]
publish:
image: docker.io/woodpeckerci/plugin-docker-buildx:latest
settings:
dockerfile: Dockerfile
platforms: linux/amd64
repo: *repo
registry: codeberg.org
tags: latest,${CI_COMMIT_SHA:0:8},${CI_COMMIT_TAG}
username: ${CI_REPO_OWNER}
password:
from_secret: REGISTRY_TOKEN
when:
event: [tag]
branch: main

View File

@@ -1,278 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
## [v1.0.14](https://codeberg.org/scip/tablizer/tree/v1.0.14) - 2023-01-23
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.13...v1.0.14)
### Fixed
- The -D parameter could not be used together with -a.
- Fixed invalid argv handling: when the user wanted to read from stdin
but gave an argument which was meant as a pattern, but also existed
as a filename, then tablizer opened the file, ignored stdin.
- Makefile indentation
### Added
- added licens notes about dependencies
- using hard coded uniseq version, see actions#3396457307
- updated dependencies (go module versions)
## [v1.0.13](https://codeberg.org/scip/tablizer/tree/v1.0.13) - 2022-11-03
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.12...v1.0.13)
### Added
- Added command line flag to generate shell completion code
- Added an animated demo gif to the README to demonstrate the tool
### Fixed
- The `-A` flag wasn't implemented (default output mode).
- Fixed building from source on systems w/o perls pod tools,
which is not requrired anyway since I always commit the latest
manpage.
## [v1.0.12](https://codeberg.org/scip/tablizer/tree/v1.0.12) - 2022-10-25
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.11...v1.0.12)
### Added
- Added support to parse CSV input
- Added CSV output support
- Added support for environment variables
### Changed
- We do not use the generated help message anymore, instead we use the
usage from the manpage, which we have to maintain anyway. It looks
better and has flag groups, which cobra is still lacking as of this
writing.
- More refactoring and re-organization, runtime configuration now
lives in the cfg module.
### Fixed
- Fixed [Bug #5](https://codeberg.org/scip/tablizer/issues/5), where
matches have not been highlighted correctly in some rare cases.
## [v1.0.11](https://codeberg.org/scip/tablizer/tree/v1.0.11) - 2022-10-19
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.10...v1.0.11)
### Added
- Added CI job golinter to regularly check for common mistakes.
- Added YAML output mode.
- Added more unit tests, we're over 95% in the lib module.
### Changed
- do not use any global variables anymore, makes the code easier to
maintain, understand and test
- using io.Writer in print* functions, which is easier to test, also
re-implemented the print tests.
- replaced go-str2duration with my own implementation `duration2int()`.
## [v1.0.10](https://codeberg.org/scip/tablizer/tree/v1.0.10) - 2022-10-15
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.9...v1.0.10)
### Added
- Added various sort modes: sort by time, by duration, numerical (-a -t -i)
- Added possibility to modify sort order to descending (-D)
- Added support to specify a regexp in column selector -c, which can
also be mixed with numerical column spec
- More unit tests
### Fixed
- Column specification allowed to specify duplicate columns like `-c
1,2,1,2` unchecked. Now this list will be deduplicated before use.
## [v1.0.9](https://codeberg.org/scip/tablizer/tree/v1.0.9) - 2022-10-14
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.8...v1.0.9)
### Added
- Added Changelog, Contribution guidelines and no COC.
### Changed
- some minor changes to satisfy linter.
## [v1.0.8](https://codeberg.org/scip/tablizer/tree/v1.0.8) - 2022-10-13
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.7...v1.0.8)
### Added
- Added sort support with the new parameter -k (like sort(1)).
## [v1.0.7](https://codeberg.org/scip/tablizer/tree/v1.0.7) - 2022-10-11
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.6...v1.0.7)
### Added
- Added pattern highlighting support.
- Added more unit tests.
### Fixed
- Fixed extended more output in combination with -c.
- Fixed issue #4, the version string was missing.
## [v1.0.6](https://codeberg.org/scip/tablizer/tree/v1.0.6) - 2022-10-05
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.5...v1.0.6)
### Added
- Added documentation about regexp syntax in the manpage.
- Added more unit tests.
### Changed
- Rewrote the input parser.
- Some more refactoring work has been done.
## [v1.0.5](https://codeberg.org/scip/tablizer/tree/v1.0.5) - 2022-10-05
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.4...v1.0.5)
### Added
- A new option has been added: --invert-match -v which behaves like
the same option in grep(1): it inverts the pattern match.
- A few more unit tests have been added.
### Fixed
- Pattern matching did not work, because the (new) help subcommand
lead to cobra taking care of the first arg to the program
(argv[1]). So now there's a new parameter -m which displays the
manpage and no more subcommands.
## [v1.0.4](https://codeberg.org/scip/tablizer/tree/v1.0.4) - 2022-10-04
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.3...v1.0.4)
### Added
- Development version of the compiled binary now uses git vars
in addition to program version.
- Added an option to display the manual page (compiled in) as text:
--help, for cases where a user just installed the binary.
### Changed
- Fixed go module namespace.
## [v1.0.3](https://codeberg.org/scip/tablizer/tree/v1.0.3) - 2022-10-03
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.2...v1.0.3)
### Added
- Added a new output mode: shell mode, which allows the user
to use the output in a shell eval loop to further process
the data.
### Changed
- More refactoring work has been done.
## [v1.0.2](https://codeberg.org/scip/tablizer/tree/v1.0.2) - 2022-10-02
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.1...v1.0.2)
### Added
- Added some basic unit tests.
### Changed
- Code has been refactored to be more efficient.
- Replaced table generation code with Tablewriter.
## [v1.0.1](https://codeberg.org/scip/tablizer/tree/v1.0.1) - 2022-09-30
[Full Changelog](https://codeberg.org/scip/tablizer/compare/v1.0.0...v1.0.1)
### Added
- Added a unix manual page.
- Added release builder to Makefile
### Changed
- Various minor fixes.
## [v1.0.0](https://codeberg.org/scip/tablizer/tree/v1.0.0) - 2022-09-28
[Full Changelog](https://codeberg.org/scip/tablizer/compare/02a64a5c3fe4220df2c791ff1421d16ebd428c19...v1.0.0)
Initial release.

View File

@@ -219,7 +219,7 @@ hesitate to ask me about it, I'll add it.
The documentation is provided as a unix man-page. It will be
automatically installed if you install from source.
[However, you can read the man-page online](https://codeberg.org/scip/tablizer/raw/branch/main/tablizer.pod).
[However, you can read the man-page online](https://codeberg.org/scip/tablizer/raw/branch/tablizer.pod).
Or if you cloned the repository you can read it this way (perl needs
to be installed though): `perldoc tablizer.pod`.

View File

@@ -28,7 +28,7 @@ import (
)
const (
Version = "v1.5.12"
Version = "v1.5.11"
MAXPARTS = 2
)
@@ -95,7 +95,6 @@ type Config struct {
InputJSON bool
AutoHeaders bool
CustomHeaders []string
Template string
SortMode string
SortDescending bool
@@ -143,7 +142,6 @@ type Modeflag struct {
A bool
C bool
J bool
P bool // template
}
// used for switching printers
@@ -156,7 +154,6 @@ const (
CSV
ASCII
Json
Template
)
// various sort types
@@ -297,8 +294,6 @@ func (conf *Config) PrepareModeFlags(flag Modeflag) {
conf.OutputMode = CSV
case flag.J:
conf.OutputMode = Json
case conf.Template != "":
conf.OutputMode = Template
default:
conf.OutputMode = ASCII
}

View File

@@ -23,9 +23,9 @@ import (
"slices"
"strings"
"github.com/spf13/cobra"
"codeberg.org/scip/tablizer/cfg"
"codeberg.org/scip/tablizer/lib"
"github.com/spf13/cobra"
)
func completion(cmd *cobra.Command, mode string) error {
@@ -179,8 +179,6 @@ func Execute() {
"Enable ASCII output (default)")
rootCmd.MarkFlagsMutuallyExclusive("extended", "markdown", "orgtbl",
"shell", "yaml", "csv")
rootCmd.PersistentFlags().StringVarP(&conf.Template, "template", "P", "",
"template for template output mode")
// config file
rootCmd.PersistentFlags().StringVarP(&conf.Configfile, "config", "f", cfg.DefaultConfigfile,

View File

@@ -13,6 +13,6 @@ const shortusage = `tablizer [regex,...] [-r file] [flags]
-x col,... use custom headers -d debug
-o char use char as output separator -g auto generate headers
-O org -C CSV -M md -X ext -S shell -Y yaml -J json -P template
-a sort by age -i sort numerically -t sort by time -D sort descending order
-m show manual -v show version --help show detailed help`
-O org -C CSV -M md -X ext -S shell -Y yaml -J json -D sort descending order
-m show manual --help show detailed help -v show version
-a sort by age -i sort numerically -t sort by time`

View File

@@ -34,7 +34,6 @@ SYNOPSIS
-J, --jsonout Enable JSON output
-C, --csv Enable CSV output
-A, --ascii Default output mode, ascii tabular
-P, --template <tpl> Enable template mode with template <tpl>
-L, --hightlight-lines Use alternating background colors for tables
-o, --ofs <char> Output field separator, used by -A and -C.
-y, --yank-columns Yank specified columns (separated by ,) to clipboard,
@@ -78,16 +77,16 @@ DESCRIPTION
use the -v option to exclude all rows which match the pattern. Hence:
# read from STDIN
> kubectl get pods | tablizer
kubectl get pods | tablizer
# read a file
> tablizer -r filename
tablizer -r filename
# search for pattern in a file (works like grep)
> tablizer regex -r filename
tablizer regex -r filename
# search for pattern in STDIN
> kubectl get pods | tablizer regex
kubectl get pods | tablizer regex
The output looks like the original one. You can add the option -n, then
every header field will have a numer associated with it, e.g.:
@@ -97,18 +96,18 @@ DESCRIPTION
These numbers denote the column and you can use them to specify which
columns you want to have in your output (see COLUMNS:
> kubectl get pods | tablizer -c1,3
kubectl get pods | tablizer -c1,3
You can specify the numbers in any order but output will always follow
the original order.
However, you may also just use the header names instead of numbers, eg:
> kubectl get pods | tablizer -cname,status
kubectl get pods | tablizer -cname,status
You can also use regular expressions with -c, eg:
> kubectl get pods | tablizer -c '[ae]'
kubectl get pods | tablizer -c '[ae]'
By default tablizer shows a header containing the names of each column.
This can be disabled using the -H option. Be aware that this only
@@ -219,7 +218,7 @@ DESCRIPTION
Example for a case insensitive search:
> kubectl get pods -A | tablizer "/account/i"
kubectl get pods -A | tablizer "/account/i"
If you use the "!" flag, then the regex match will be negated, that is,
if a line in the input matches the given regex, but "!" is supplied,
@@ -285,7 +284,7 @@ DESCRIPTION
We want to see only the CMD column and use a regex for this:
> ps | tablizer -s '\s+' -c C
ps | tablizer -s '\s+' -c C
CMD(4)
bash
ps
@@ -316,7 +315,7 @@ DESCRIPTION
Example:
> cat t/testtable2
cat t/testtable2
NAME DURATION
x 10
a 100
@@ -324,7 +323,7 @@ DESCRIPTION
u 4
k 6
> cat t/testtable2 | tablizer -T2 -R '/^\d/4/' -n
cat t/testtable2 | tablizer -T2 -R '/^\d/4/' -n
NAME DURATION
x 40
a 400
@@ -340,7 +339,7 @@ DESCRIPTION
header left, value right, aligned by the field widths. Here's an
example:
> kubectl get pods | ./tablizer -o extended
kubectl get pods | ./tablizer -o extended
NAME: repldepl-7bcd8d5b64-7zq4l
READY: 1/1
STATUS: Running
@@ -353,7 +352,7 @@ DESCRIPTION
The option -o shell can be used if the output has to be processed by the
shell, it prints variable assignments for each cell, one line per row:
> kubectl get pods | ./tablizer -o extended ./tablizer -o shell
kubectl get pods | ./tablizer -o extended ./tablizer -o shell
NAME="repldepl-7bcd8d5b64-7zq4l" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
NAME="repldepl-7bcd8d5b64-m48n8" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
NAME="repldepl-7bcd8d5b64-q2bf4" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
@@ -365,18 +364,6 @@ DESCRIPTION
markdown which prints a Markdown table, yaml, which prints yaml encoding
and CSV mode, which prints a comma separated value file.
A special output mode ist the Template mode, activated with the option
"--template". Template language is the Golang template language:
<https://pkg.go.dev/text/template>. You can also use lot's of additional
functions from: <https://masterminds.github.io/sprig/>. Here's an
example:
> kubectl get pods | tablizer --template "{{.name}} is {{.status}}"
alertmanager-kube-prometheus-alertmanager-0 is Running
grafana-fcc54cbc9-bk7s8 is Running
You can use header names as variables.
PUT FIELDS TO CLIPBOARD
You can let tablizer put fields to the clipboard using the option "-y".
This best fits the use-case when the result of your filtering yields
@@ -545,7 +532,6 @@ Output Flags (mutually exclusive):
-J, --jsonout Enable JSON output
-C, --csv Enable CSV output
-A, --ascii Default output mode, ascii tabular
-P, --template <tpl> Enable template mode with template <tpl>
-L, --hightlight-lines Use alternating background colors for tables
-o, --ofs <char> Output field separator, used by -A and -C.
-y, --yank-columns Yank specified columns (separated by ,) to clipboard,

11
go.mod
View File

@@ -22,10 +22,6 @@ require (
)
require (
dario.cat/mergo v1.0.1 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.3.0 // indirect
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/agext/levenshtein v1.2.3 // indirect
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
@@ -38,16 +34,12 @@ require (
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/reflow v0.3.0 // indirect
@@ -57,12 +49,9 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/spf13/cast v1.7.0 // indirect
github.com/spf13/pflag v1.0.9 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/zclconf/go-cty v1.16.3 // indirect
golang.org/x/crypto v0.38.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/sync v0.15.0 // indirect

22
go.sum
View File

@@ -1,11 +1,3 @@
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
@@ -46,16 +38,12 @@ github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0=
github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E=
github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA=
github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs=
github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE=
github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4=
@@ -72,12 +60,8 @@ github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRC
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
@@ -104,10 +88,6 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
@@ -127,8 +107,6 @@ github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6
github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=

View File

@@ -1,5 +1,5 @@
/*
Copyright © 2022-2025 Thomas von Dein
Copyright © 2022-2024 Thomas von Dein
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,11 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package lib
import (
"strconv"
"strings"
)
// contains a whole parsed table
type Tabdata struct {
maxwidthHeader int // longest header
@@ -39,41 +34,3 @@ func (data *Tabdata) CloneEmpty() Tabdata {
return newdata
}
// convert our internal data to a list of maps
func (data *Tabdata) ToMap() []map[string]any {
dictlist := make([]map[string]any, len(data.entries))
headers := make([]string, len(data.headers))
for idx, header := range data.headers {
headers[idx] = strings.ToLower(header)
}
for line, row := range data.entries {
dict := make(map[string]any, len(data.headers))
for col, cell := range row {
n, ok := strconv.Atoi(cell)
if ok == nil {
dict[headers[col]] = n
continue
}
if strings.ToLower(cell) == "true" {
dict[headers[col]] = true
continue
}
if strings.ToLower(cell) == "false" {
dict[headers[col]] = false
continue
}
dict[headers[col]] = cell
}
dictlist[line] = dict
}
return dictlist
}

View File

@@ -25,10 +25,8 @@ import (
"log"
"strconv"
"strings"
"text/template"
"codeberg.org/scip/tablizer/cfg"
"github.com/Masterminds/sprig/v3"
"github.com/gookit/color"
"github.com/olekukonko/tablewriter"
"github.com/olekukonko/tablewriter/renderer"
@@ -68,8 +66,6 @@ func printData(writer io.Writer, conf cfg.Config, data *Tabdata) {
printJsonData(writer, data)
case cfg.CSV:
printCSVData(writer, conf, data)
case cfg.Template:
printTemplateData(writer, conf, data)
default:
printASCIIData(writer, conf, data)
}
@@ -392,25 +388,3 @@ func printCSVData(writer io.Writer, conf cfg.Config, data *Tabdata) {
log.Fatal(err)
}
}
func printTemplateData(writer io.Writer, conf cfg.Config, data *Tabdata) {
tmpl, err := template.New("printer").Funcs(sprig.TxtFuncMap()).Parse(conf.Template)
if err != nil {
log.Fatalf("failed to parse template: %s", err)
}
buf := strings.Builder{}
for line, dict := range data.ToMap() {
err = tmpl.Execute(&buf, dict)
if err != nil {
log.Fatalf("failed to execute template in line %d: %s", line, err)
}
buf.WriteString("\n")
}
if _, err := fmt.Fprintln(writer, buf.String()); err != nil {
log.Fatalf("failed to print output: %s", err)
}
}

View File

@@ -23,8 +23,8 @@ import (
"sort"
"strconv"
"codeberg.org/scip/tablizer/cfg"
"github.com/araddon/dateparse"
"codeberg.org/scip/tablizer/cfg"
)
func sortTable(conf cfg.Config, data *Tabdata) {
@@ -38,12 +38,6 @@ func sortTable(conf cfg.Config, data *Tabdata) {
return
}
for _, column := range conf.UseSortByColumn {
if column > len(data.headers) {
return
}
}
// actual sorting
sort.SliceStable(data.entries, func(i, j int) bool {
// holds the result of a sort of one column

View File

@@ -1,16 +0,0 @@
exec tablizer -r testtable.txt -P '{{.species | title}}s are {{.type }}'
stdout 'Humans are invasive'
exec tablizer -r testtable.txt -P '{{.species | sha256sum}}'
stdout '79a5478768d2447431a90f7f4549df735f50ad541371464c248abc7522dc3a01'
exec tablizer -r testtable.txt -P '{{add 100 .count}}'
stdout 104
-- testtable.txt --
SPECIES TYPE HOME COUNT STAGE
human invasive earth 4 brink
riedl peaceful keauna 33 civilized
namak invasive namak 123 imperium
heduu peaceful iu 66 imperium
kenaha peaceful kohi 3333 hunter-gatherer

View File

@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "TABLIZER 1"
.TH TABLIZER 1 "2025-12-08" "1" "User Commands"
.TH TABLIZER 1 "2025-10-13" "1" "User Commands"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -172,7 +172,6 @@ tablizer \- Manipulate tabular output of other programs
\& \-J, \-\-jsonout Enable JSON output
\& \-C, \-\-csv Enable CSV output
\& \-A, \-\-ascii Default output mode, ascii tabular
\& \-P, \-\-template <tpl> Enable template mode with template <tpl>
\& \-L, \-\-hightlight\-lines Use alternating background colors for tables
\& \-o, \-\-ofs <char> Output field separator, used by \-A and \-C.
\& \-y, \-\-yank\-columns Yank specified columns (separated by ,) to clipboard,
@@ -220,16 +219,16 @@ pattern. Hence:
.PP
.Vb 2
\& # read from STDIN
\& > kubectl get pods | tablizer
\& kubectl get pods | tablizer
\&
\& # read a file
\& > tablizer \-r filename
\& tablizer \-r filename
\&
\& # search for pattern in a file (works like grep)
\& > tablizer regex \-r filename
\& tablizer regex \-r filename
\&
\& # search for pattern in STDIN
\& > kubectl get pods | tablizer regex
\& kubectl get pods | tablizer regex
.Ve
.PP
The output looks like the original one. You can add the option \fB\-n\fR,
@@ -243,7 +242,7 @@ These numbers denote the column and you can use them to specify which
columns you want to have in your output (see \s-1COLUMNS\s0:
.PP
.Vb 1
\& > kubectl get pods | tablizer \-c1,3
\& kubectl get pods | tablizer \-c1,3
.Ve
.PP
You can specify the numbers in any order but output will always follow
@@ -253,13 +252,13 @@ However, you may also just use the header names instead of numbers,
eg:
.PP
.Vb 1
\& > kubectl get pods | tablizer \-cname,status
\& kubectl get pods | tablizer \-cname,status
.Ve
.PP
You can also use regular expressions with \fB\-c\fR, eg:
.PP
.Vb 1
\& > kubectl get pods | tablizer \-c \*(Aq[ae]\*(Aq
\& kubectl get pods | tablizer \-c \*(Aq[ae]\*(Aq
.Ve
.PP
By default tablizer shows a header containing the names of each
@@ -382,7 +381,7 @@ and append the flag. The following flags are supported:
Example for a case insensitive search:
.PP
.Vb 1
\& > kubectl get pods \-A | tablizer "/account/i"
\& kubectl get pods \-A | tablizer "/account/i"
.Ve
.PP
If you use the \f(CW\*(C`!\*(C'\fR flag, then the regex match will be negated, that
@@ -461,7 +460,7 @@ Lets take this table:
We want to see only the \s-1CMD\s0 column and use a regex for this:
.PP
.Vb 6
\& > ps | tablizer \-s \*(Aq\es+\*(Aq \-c C
\& ps | tablizer \-s \*(Aq\es+\*(Aq \-c C
\& CMD(4)
\& bash
\& ps
@@ -498,7 +497,7 @@ use a regexp containing the \f(CW\*(C`/\*(C'\fR character, eg:
Example:
.PP
.Vb 7
\& > cat t/testtable2
\& cat t/testtable2
\& NAME DURATION
\& x 10
\& a 100
@@ -506,7 +505,7 @@ Example:
\& u 4
\& k 6
\&
\& > cat t/testtable2 | tablizer \-T2 \-R \*(Aq/^\ed/4/\*(Aq \-n
\& cat t/testtable2 | tablizer \-T2 \-R \*(Aq/^\ed/4/\*(Aq \-n
\& NAME DURATION
\& x 40
\& a 400
@@ -524,7 +523,7 @@ printed vertically, header left, value right, aligned by the field
widths. Here's an example:
.PP
.Vb 6
\& > kubectl get pods | ./tablizer \-o extended
\& kubectl get pods | ./tablizer \-o extended
\& NAME: repldepl\-7bcd8d5b64\-7zq4l
\& READY: 1/1
\& STATUS: Running
@@ -540,7 +539,7 @@ by the shell, it prints variable assignments for each cell, one line
per row:
.PP
.Vb 4
\& > kubectl get pods | ./tablizer \-o extended ./tablizer \-o shell
\& kubectl get pods | ./tablizer \-o extended ./tablizer \-o shell
\& NAME="repldepl\-7bcd8d5b64\-7zq4l" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
\& NAME="repldepl\-7bcd8d5b64\-m48n8" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
\& NAME="repldepl\-7bcd8d5b64\-q2bf4" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
@@ -551,22 +550,8 @@ You can use this in an eval loop.
Beside normal ascii mode (the default) and extended mode there are
more output modes available: \fBorgtbl\fR which prints an Emacs org-mode
table and \fBmarkdown\fR which prints a Markdown table, \fByaml\fR, which
prints yaml encoding and \fB\s-1CSV\s0\fR mode, which prints a comma separated
prints yaml encoding and \s-1CSV\s0 mode, which prints a comma separated
value file.
.PP
A special output mode ist the \fBTemplate\fR mode, activated with the
option \f(CW\*(C`\-\-template\*(C'\fR. Template language is the Golang template
language: <https://pkg.go.dev/text/template>. You can also use lot's
of additional functions from:
<https://masterminds.github.io/sprig/>. Here's an example:
.PP
.Vb 3
\& > kubectl get pods | tablizer \-\-template "{{.name}} is {{.status}}"
\& alertmanager\-kube\-prometheus\-alertmanager\-0 is Running
\& grafana\-fcc54cbc9\-bk7s8 is Running
.Ve
.PP
You can use header names as variables.
.SS "\s-1PUT FIELDS TO CLIPBOARD\s0"
.IX Subsection "PUT FIELDS TO CLIPBOARD"
You can let tablizer put fields to the clipboard using the option

View File

@@ -33,7 +33,6 @@ tablizer - Manipulate tabular output of other programs
-J, --jsonout Enable JSON output
-C, --csv Enable CSV output
-A, --ascii Default output mode, ascii tabular
-P, --template <tpl> Enable template mode with template <tpl>
-L, --hightlight-lines Use alternating background colors for tables
-o, --ofs <char> Output field separator, used by -A and -C.
-y, --yank-columns Yank specified columns (separated by ,) to clipboard,
@@ -81,16 +80,16 @@ may also use the B<-v> option to exclude all rows which match the
pattern. Hence:
# read from STDIN
> kubectl get pods | tablizer
kubectl get pods | tablizer
# read a file
> tablizer -r filename
tablizer -r filename
# search for pattern in a file (works like grep)
> tablizer regex -r filename
tablizer regex -r filename
# search for pattern in STDIN
> kubectl get pods | tablizer regex
kubectl get pods | tablizer regex
The output looks like the original one. You can add the option B<-n>,
then every header field will have a numer associated with it, e.g.:
@@ -100,7 +99,7 @@ then every header field will have a numer associated with it, e.g.:
These numbers denote the column and you can use them to specify which
columns you want to have in your output (see L<COLUMNS>:
> kubectl get pods | tablizer -c1,3
kubectl get pods | tablizer -c1,3
You can specify the numbers in any order but output will always follow
the original order.
@@ -108,11 +107,11 @@ the original order.
However, you may also just use the header names instead of numbers,
eg:
> kubectl get pods | tablizer -cname,status
kubectl get pods | tablizer -cname,status
You can also use regular expressions with B<-c>, eg:
> kubectl get pods | tablizer -c '[ae]'
kubectl get pods | tablizer -c '[ae]'
By default tablizer shows a header containing the names of each
column. This can be disabled using the B<-H> option. Be aware that
@@ -237,7 +236,7 @@ and append the flag. The following flags are supported:
Example for a case insensitive search:
> kubectl get pods -A | tablizer "/account/i"
kubectl get pods -A | tablizer "/account/i"
If you use the C<!> flag, then the regex match will be negated, that
is, if a line in the input matches the given regex, but C<!> is
@@ -308,7 +307,7 @@ Lets take this table:
We want to see only the CMD column and use a regex for this:
> ps | tablizer -s '\s+' -c C
ps | tablizer -s '\s+' -c C
CMD(4)
bash
ps
@@ -341,7 +340,7 @@ use a regexp containing the C</> character, eg:
Example:
> cat t/testtable2
cat t/testtable2
NAME DURATION
x 10
a 100
@@ -349,7 +348,7 @@ Example:
u 4
k 6
> cat t/testtable2 | tablizer -T2 -R '/^\d/4/' -n
cat t/testtable2 | tablizer -T2 -R '/^\d/4/' -n
NAME DURATION
x 40
a 400
@@ -366,7 +365,7 @@ useful which enables I<extended mode>. In this mode, each row will be
printed vertically, header left, value right, aligned by the field
widths. Here's an example:
> kubectl get pods | ./tablizer -o extended
kubectl get pods | ./tablizer -o extended
NAME: repldepl-7bcd8d5b64-7zq4l
READY: 1/1
STATUS: Running
@@ -380,7 +379,7 @@ The option B<-o shell> can be used if the output has to be processed
by the shell, it prints variable assignments for each cell, one line
per row:
> kubectl get pods | ./tablizer -o extended ./tablizer -o shell
kubectl get pods | ./tablizer -o extended ./tablizer -o shell
NAME="repldepl-7bcd8d5b64-7zq4l" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
NAME="repldepl-7bcd8d5b64-m48n8" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
NAME="repldepl-7bcd8d5b64-q2bf4" READY="1/1" STATUS="Running" RESTARTS="9 (47m ago)" AGE="4d23h"
@@ -390,22 +389,9 @@ You can use this in an eval loop.
Beside normal ascii mode (the default) and extended mode there are
more output modes available: B<orgtbl> which prints an Emacs org-mode
table and B<markdown> which prints a Markdown table, B<yaml>, which
prints yaml encoding and B<CSV> mode, which prints a comma separated
prints yaml encoding and CSV mode, which prints a comma separated
value file.
A special output mode ist the B<Template> mode, activated with the
option C<--template>. Template language is the Golang template
language: L<https://pkg.go.dev/text/template>. You can also use lot's
of additional functions from:
L<https://masterminds.github.io/sprig/>. Here's an example:
> kubectl get pods | tablizer --template "{{.name}} is {{.status}}"
alertmanager-kube-prometheus-alertmanager-0 is Running
grafana-fcc54cbc9-bk7s8 is Running
You can use header names as variables.
=head2 PUT FIELDS TO CLIPBOARD
You can let tablizer put fields to the clipboard using the option