From 4bf833ec3ee900a1ecc470c9548a6dc7bb63760e Mon Sep 17 00:00:00 2001 From: solidiquis Date: Mon, 20 Jan 2025 22:42:24 -0800 Subject: [PATCH] README --- README.md | 27 ++++++++++++++++++++------- images/demo.png | Bin 803818 -> 646154 bytes 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index af5f43d..d8641d2 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,31 @@ [![Crates.io](https://img.shields.io/crates/v/grits.svg)](https://crates.io/crates/grits) [![Crates.io](https://img.shields.io/crates/d/grits)](https://crates.io/crates/grits) -`grits` is a minimal, simple, and easy-to-use line text-formatter that applies regular expressions with named captures to input lines -and transforms them using a template string. It allows for efficient parsing, extracting, and formatting of text, -including support for colorization and other attributes you'd get using ANSI escape sequences. +A simple line-text formatter that makes it simple to parse, filter, and format live logs, turning noise into meaningful insights. -The following example demonstrates how to apply `grits` to `tcpdump` to extract a packet's source (`src`) and destination (`dst`) IP address: +![demo gif](images/log.gif) + +

+ An example of Grits in action: the left pane shows Grits being applied, and the right pane displays the raw logs. +

+ + +At its core, `grits` applies regular expressions with named captures to input lines. These captures are then available as variables +(a.k.a. anchors) which can then be used in a `grits` template string. The template string supports text-alignment, colorization, +as well as other attributes you'd expect using ANSI escape sequences. + +The following example demonstrates how to apply `grits` to `tcpdump` to extract an output line's timestamp (`ts`) and +a packet's source (`src`) and destination (`dst`) IP address: ```bash -sudo tcpdump -nn | grits -p '^(?[^ ]+)' \ +tcpdump -nn | grits -- \ + -p '^(?[^ ]+)' \ -p 'IP\w? (?[^ ]+)' \ -p '> (?[^ ]+):' \ - -t '[{(cyan|bold):ts}] {(green|underlined):"src"}={src} {(yellow|underlined):"dst"}={dst}' + -t '[{(cyan|bold):ts}] {(green|underlined):"src"}={(lalign(45)):src} {(yellow|underlined):"dst"}={dst}' ``` ![demo image](images/demo.png) -The top pane in the above screenshot is the raw output of `tcpdump` while the bottom pane shows the output being piped into `grits`. +

+ The top pane in the above screenshot is the raw output of tcpdump while the bottom pane shows the output being piped into grits. +

diff --git a/images/demo.png b/images/demo.png index 88798af119d56f86d882102000b0f640b9be91bc..a88c294ad2a0231a4b1bc4b78acd0ebac4c2941e 100644 GIT binary patch literal 646154 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