This is choose, a human-friendly and fast alternative to cut and (sometimes) awk

Related tags

Command-line choose
Overview

Choose

This is choose, a human-friendly and fast alternative to cut and (sometimes) awk

choose demo

Features

  • terse field selection syntax similar to Python's list slices
  • negative indexing from end of line
  • optional start/end index
  • zero-indexed
  • reverse ranges
  • slightly faster than cut for sufficiently long inputs, much faster than awk
  • regular expression field separators using Rust's regex syntax

Rationale

The AWK programming language is designed for text processing and is extremely capable in this endeavor. However, the awk command is not ideal for rapid shell use, with its requisite quoting of a line wrapped in curly braces, even for the simplest of programs:

awk '{print $1}'

Likewise, cut is far from ideal for rapid shell use, because of its confusing syntax. Field separators and ranges are just plain difficult to get right on the first try.

It is for these reasons that I present to you choose. It is not meant to be a drop-in or complete replacement for either of the aforementioned tools, but rather a simple and intuitive tool to reach for when the basics of awk or cut will do, but the overhead of getting them to behave should not be necessary.

Contributing

Please see our guidelines in contributing.md.

Usage

$ choose --help
choose 1.2.0
`choose` sections from each line of files

USAGE:
    choose [FLAGS] [OPTIONS] ...

FLAGS:
    -c, --character-wise    Choose fields by character number
    -d, --debug             Activate debug mode
    -x, --exclusive         Use exclusive ranges, similar to array indexing in many programming languages
    -h, --help              Prints help information
    -n, --non-greedy        Use non-greedy field separators
    -V, --version           Prints version information

OPTIONS:
    -f, --field-separator 
            Specify field separator other than whitespace, using Rust `regex` syntax

    -i, --input                                       Input file
    -o, --output-field-separator     Specify output field separator

ARGS:
    ...    Fields to print. Either a, a:b, a..b, or a..=b, where a and b are integers. The beginning or end
                    of a range can be omitted, resulting in including the beginning or end of the line,
                    respectively. a:b is inclusive of b (unless overridden by -x). a..b is exclusive of b and a..=b
                    is inclusive of b

Examples

choose 5                # print the 5th item from a line (zero indexed)

choose -f ':' 0 3 5     # print the 0th, 3rd, and 5th item from a line, where
                        # items are separated by ':' instead of whitespace

choose 2:5              # print everything from the 2nd to 5th item on the line,
                        # inclusive of the 5th

choose -x 2:5           # print everything from the 2nd to 5th item on the line,
                        # exclusive of the 5th

choose :3               # print the beginning of the line to the 3rd item

choose -x :3            # print the beginning of the line to the 3rd item,
                        # exclusive

choose 3:               # print the third item to the end of the line

choose -1               # print the last item from a line

choose -3:-1            # print the last three items from a line

Compilation and Installation

Installing From Source

In order to build choose you will need the rust toolchain installed. You can find instructions here.

Then, to install:

$ git clone https://github.com/theryangeary/choose.git
$ cd choose
$ cargo build --release
$ install target/release/choose <DESTDIR>

Just make sure DESTDIR is in your path.

Installing From Package Managers

Cargo:

$ cargo install choose

Arch Linux:

$ yay -S choose-rust-git

Fedora/CentOS COPR:

$ dnf copr enable atim/choose
$ dnf install choose

Homebrew:

$ brew install choose-rust

Benchmarking

Benchmarking is performed using the bench utility.

Benchmarking is based on the assumption that there are five files in test/ that match the glob "long*txt". GitHub doesn't support files big enough in normal repos, but for reference the files I'm working with have lengths like these:

     1000 test/long.txt
    19272 test/long_long.txt
    96360 test/long_long_long.txt
   963600 test/long_long_long_long.txt
 10599600 test/long_long_long_long_long.txt

and content generally like this:

Those an equal point no years do. Depend warmth fat but her but played. Shy and
subjects wondered trifling pleasant. Prudent cordial comfort do no on colonel as
assured chicken. Smart mrs day which begin. Snug do sold mr it if such.
Terminated uncommonly at at estimating. Man behaviour met moonlight extremity
acuteness direction.

Ignorant branched humanity led now marianne too strongly entrance. Rose to shew
bore no ye of paid rent form. Old design are dinner better nearer silent excuse.
She which are maids boy sense her shade. Considered reasonable we affronting on
expression in. So cordial anxious mr delight. Shot his has must wish from sell
Comments
  • [WIP] Switch from structopt to clap v4

    [WIP] Switch from structopt to clap v4

    As clap v3 is now out, and the structopt features are integrated into (almost as-is), structopt is now in maintenance mode: no new feature will be added [1]. Consequently, it seems appropriate to switch to clap v3 to benefit from the continued development.

    clap v3 is slightly larger than structopt. This is the affect on some basic metrics:

    | Metric                | Before | After |
    |-----------------------|--------|-------|
    | compile release (sec) | 6.25   | 8.00  |
    | binary size (MB)      | 6.2    | 6.3   |
    

    Also note that we break away from the default clap v3 behavior in one case: exit codes. In the transition for v2 to v3, clap switched from an exit status of 1 to an exit status of 2. For compatibility with previous version of choose, we still return an exit code of 1, rather than 2.

    Tested: Ran cargo test:

    test result: ok. 206 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
    

    Ran test/e2e_test.sh:

    All tests passed
    

    In addition, this PR cleans up some clippy lints while we're at it :). You can see these yourself if you checkout after the first commit and run cargo clippy with clippy v0.1.64.

    I'd suggest reviewing patch-by-patch, I tried to organize the changes.

    opened by lukehsiao 13
  • feature request: match columns by name

    feature request: match columns by name

    I'd like choose to take an option under which it treats the first row as headers, and allows selecting columns by name. This saves counting, and is especially nice in scripts where it's more clear what is going on and somewhat more resilient to changes in the input format. Not sure if it should be exact-match, prefix, case-insensitive....

    I'm happy to open a PR if you like this idea.

    opened by bergey 5
  • Exclusivity / inclusivity problems

    Exclusivity / inclusivity problems

    I've come across several issues with inclusivity / exclusivity:

    readme mistake

    The readme.md says:

    choose :3              # print the beginning of the line to the 3rd item,
                           # exclusive
    

    Which I take to mean that the item with index 3 won't be included when :3 is used, i.e: echo 0 1 2 3 | choose :3 should output 0 1 2. However, it outputs 0 1 2 3. Is the readme.md wrong? Did you intend to add a -x there and forgot? Or is that a bug?

    python-like

    Claiming choose is Python like and then requiring -x for exclusivity is wrong in my opinion, to aim to be more Python-like, choose should be exclusive by default.

    Python:

    In [1]: [0,1,2,3][:3]
    Out[1]: [0, 1, 2]
    

    Choose:

    $ echo 0 1 2 3 | choose :3
    0 1 2 3
    

    Empty results when using -x

    Since I want choose to be more Python-like, I created an alias alias c='choose -x' so it's always exclusive by default. However, when I try to use it like this:

    $ echo 0 1 2 3 | c 2
    
    
    

    Nothing is output, as shown.

    What do you think?

    opened by omertuc 5
  • Crash from empty input and negative choice

    Crash from empty input and negative choice

    $ choose --version
    choose 1.3.2
    $ export RUST_BACKTRACE=full
    
    $ echo "0 1 2 3 4" | choose 0
    0
    
    $ echo "0 1 2 3 4" | choose -1
    4
    
    $ echo "" | choose 0
    
    $ echo "" | choose -1
    thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/choice.rs:186:18
    stack backtrace:
       0:     0x55784c8bbf00 - std::backtrace_rs::backtrace::libunwind::trace::ha5edb8ba5c6b7a6c
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/../../backtrace/src/backtrace/libunwind.rs:90:5
       1:     0x55784c8bbf00 - std::backtrace_rs::backtrace::trace_unsynchronized::h0de86d320a827db2
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
       2:     0x55784c8bbf00 - std::sys_common::backtrace::_print_fmt::h97b9ad6f0a1380ff
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/sys_common/backtrace.rs:67:5
       3:     0x55784c8bbf00 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h14be7eb08f97fe80
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/sys_common/backtrace.rs:46:22
       4:     0x55784c8d805f - core::fmt::write::h2ca8877d3e0e52de
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/core/src/fmt/mod.rs:1094:17
       5:     0x55784c8b9f55 - std::io::Write::write_fmt::h64f5987220b618f4
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/io/mod.rs:1584:15
       6:     0x55784c8bde7b - std::sys_common::backtrace::_print::h7f1a4097308f2e0a
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/sys_common/backtrace.rs:49:5
       7:     0x55784c8bde7b - std::sys_common::backtrace::print::h1f799fc2ca7f5035
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/sys_common/backtrace.rs:36:9
       8:     0x55784c8bde7b - std::panicking::default_hook::{{closure}}::hf38436e8a3ce1071
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:208:50
       9:     0x55784c8bd94d - std::panicking::default_hook::he2f8f3fae11ed1dd
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:225:9
      10:     0x55784c8be48d - std::panicking::rust_panic_with_hook::h79a18548bd90c7d4
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:591:17
      11:     0x55784c8bdff7 - std::panicking::begin_panic_handler::{{closure}}::h212a72cc08e25126
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:495:13
      12:     0x55784c8bc39c - std::sys_common::backtrace::__rust_end_short_backtrace::hbd6897dd42bc0fcd
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/sys_common/backtrace.rs:141:18
      13:     0x55784c8bdf89 - rust_begin_unwind
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:493:5
      14:     0x55784c7c7cf1 - core::panicking::panic_fmt::h77ecd04e9b1dd84d
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/core/src/panicking.rs:92:14
      15:     0x55784c7c7c3d - core::panicking::panic::h60569d8a39169222
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/core/src/panicking.rs:50:5
      16:     0x55784c7cadb9 - choose::choice::Choice::print_choice::h9aad0eebfbda9462
      17:     0x55784c7d22a4 - choose::main::h34b573cbb97faa1e
      18:     0x55784c7ce263 - std::sys_common::backtrace::__rust_begin_short_backtrace::h58c37d283637d79b
      19:     0x55784c7ce279 - std::rt::lang_start::{{closure}}::h1dfc6e7cf9a3fc13
      20:     0x55784c8be88a - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::hc4354216bf39217c
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/core/src/ops/function.rs:259:13
      21:     0x55784c8be88a - std::panicking::try::do_call::hb68eb312780385cf
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:379:40
      22:     0x55784c8be88a - std::panicking::try::h22b8e08595060b8b
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panicking.rs:343:19
      23:     0x55784c8be88a - std::panic::catch_unwind::hc64f1a6a0e71b1fc
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/panic.rs:431:14
      24:     0x55784c8be88a - std::rt::lang_start_internal::h4461fc58637f04f8
                                   at /rustc/53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b/library/std/src/rt.rs:34:21
      25:     0x55784c7d2a62 - main
      26:     0x7f496544db25 - __libc_start_main
      27:     0x55784c7c840e - _start
      28:                0x0 - <unknown>
    
    opened by planet36 4
  • Error message after existing `less`

    Error message after existing `less`

    Issue environment:

    If I open a rather long file with many lines,

    cat file | choose 0 | less

    after existing less, choose will print out the error message with many Failed to write to output: Broken pipe (os error 32)

    opened by hntee 4
  • musl binary for linux

    musl binary for linux

    Hi,

    I work on quite old linux machines and it is not possible to install anything. Could you provide musl binaries for linux (in the same way ripgrep and fd do)

    Many thanks

    opened by elkarouh 4
  • cargo build fails

    cargo build fails

    $ cargo build --release error: failed to parse lock file at: /home/pete/stuff/choose/Cargo.lock

    Caused by: invalid serialized PackageId for key package.dependencies

    opened by pkmorrison 4
  • Brew package?

    Brew package?

    Hi,

    although the compile process went smooth on my macOS, is there any chance to push this as the brew package? The installation would be much easier...

    Thanks, Lubos

    opened by erkac 4
  • I added tab completions for fish shell

    I added tab completions for fish shell

    Hi! Cool project, I like it! And easy to use, too, but with tab completions it is even easier. I added some for fish shell:

    complete choose --no-files
    
    #flags:
    complete choose -s c -l character-wise -d "Choose fields by character number"
    complete choose -s d -l debug -d "Activate debug mode"
    complete choose -s x -l exclusive -d "Use exclusive ranges, similar to array indexing in many programming languages"
    complete choose -x -s h -l help -d "Prints help information"
    complete choose -s n -l non-greedy -d "Use non-greedy field separators"
    complete choose -l one-indexed -d "Index from 1 instead of 0"
    complete choose -s V -l version -d "Prints version information"
    
    #options:
    complete choose -x -s f -l field-separator -d "Specify field separator other than whitespace, using Rust `regex` syntax"
    complete choose -r -s i -l input -d "Specify input file"
    complete choose -x -s o -l output-field-separator -d "Specify output field separator"
    

    Do you want to bundle them with the project, or would you like me to create a pull request in the fish shell repo instead?

    opened by bagohart 3
  • `--field-separator` does not work correctly if no newline at EOF

    `--field-separator` does not work correctly if no newline at EOF

    version: commit 97b3abf5 environment: linux x86_64

    When an input has no newline at EOF, --field-separator option does not work correctly.

    $ /bin/echo 'a:b' | target/debug/choose -f ':' 1
    b
    
    $ /bin/echo -n 'a:b' | target/debug/choose -f ':' 1
    (expected "b", but no output)
    

    Moreover, if an input contains non-ASCII characters, choose can panic:

    $ /bin/echo -n 'あ:い' | target/debug/choose -f ':' 1
    thread 'main' panicked at 'byte index 6 is not a char boundary; it is inside 'い' (bytes 4..7) of `あ:い`', src/main.rs:77:22
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    

    I guess this code causes the issue: https://github.com/theryangeary/choose/blob/97b3abf5204badf60eb79be6be07285bdef83049/src/main.rs#L76-L80

    This code seems to trim the last character unconditionally, but it will have to check if a line actually has a newline.

    opened by taotao54321 3
  • Unexpected result encountered for X:-Y case

    Unexpected result encountered for X:-Y case

    Please check the test result below.

    ~% echo "1/2/3/4/5" | choose -f '/' -o '/' 1:-1
    2/3/4/5
    ~% echo "1/2/3/4/5" | choose -f '/' -o '/' 1:-2
    2/3/4
    ~% echo "1/2/3/4/5" | choose -f '/' -o '/' 1:-3
    2/3
    ~% echo "1/2/3/4/5" | choose -f '/' -o '/' 1:-4
    
    ~%
    
    

    I expected "2" from the last run. But nothing returned.

    opened by jasonyukr 3
  • swap structopt for bpaf

    swap structopt for bpaf

    Clean build is a bit faster and a bit smaller

    before:
    cargo build --release  70.39s user 3.50s system 823% cpu 8.976 total
    % ls -lha target/release/choose                                                                  
    -rwxrwxr-x 2 pacak pacak 6.1M Nov 28 20:42 target/release/choose
                                                                        
    after:
    cargo build --release  45.35s user 1.96s system 611% cpu 7.731 total
    % ls -lha target/release/choose                                                                  
    -rwxrwxr-x 2 pacak pacak 5.7M Nov 28 20:43 target/release/choose
    

    I also removed vector allocation from tests - should be faster since bpaf can take them as a reference and dropped the program name from all the arguments - it is handled automagically.

    Also added FromStr impl for Choice and replaced ToString for ParseError with std::fmt::Display.

    You might want to expose bpaf's bright-color / dull-color for cosmetic reasons. And maybe autocomplete.

    It should be possible to speed up the compilation a bit more if we replace derive API with combinatoric one.

    opened by pacak 3
  • [feature req] choose print text between or after matches

    [feature req] choose print text between or after matches

    In grep I can print what it finds between values using easy to remember syntax for perl-regexp. Could choose be extended to also find text between matches that is easier to use than perl-regexp?

    choose -m string1 string2 to print the value found after matching string1 and stopping at string2.

    choose -M string1 string2 to print the value including the matched string1 and string2. adding 0 1 2 ... could then print specific characters inside the matched result.

    choose -a string1 will look for string1 and print all the text on that line after matching string1.

    choose -A string1 will look for string1 and print all the text on that line including string1 that matched. adding 0 1 2 ... could then print specific characters inside the matched result.

    Here are some grep examples:

    Grep from match to end

    Example 1

    Text to match

    $ gdu --version
    Version:         v5.20.0
    Built time:      Sat Oct 22 10:48:31 PM CEST 2022
    Built user:      dundee
    

    gdu --version | grep -oP '(?<=Version:\t\s).*' Output: v5.20.0

    Example 2

    Text to match

    $ openssl x509 -noout -enddate -in /etc/ssl/certs/COMODO_Certification_Authority.pem
    notAfter=Dec 31 23:59:59 2029 GMT
    

    Keep only value

    openssl x509 -noout -enddate -in /etc/ssl/certs/COMODO_Certification_Authority.pem | grep -oP '(?<=notAfter=).*'
    Dec 31 23:59:59 2029 GMT
    

    Grep between matches

    Text to match

    docker inspect 9512b532dcaf1 | grep tls
                    "/etc/dockers/conf/web/tls:/etc/ssl/nginx:ro",
                    "Source": "/etc/dockers/conf/web/tls",
    
    docker inspect 9512b532dcaf1 | grep -oP '(?<="Source": ").*(tls)'
    /etc/dockers/conf/web/tls
    

    vs

    docker inspect 9512b532dcaf1 | grep -oP '(?<="Source": ").*(?=tls)'
    /etc/dockers/conf/web
    
    opened by daniejstriata 1
  • Packaging choose to debian

    Packaging choose to debian

    Hello! I'm trying package to debian, but have some errors. Do you know what it could be?

    test tests::test_process_escapes::test_unicode_crab_emoji ... FAILED test tests::test_process_escapes::test_unicode_u7fff ... FAILED failures: ---- tests::test_process_escapes::test_unicode_crab_emoji stdout ---- thread 'tests::test_process_escapes::test_unicode_crab_emoji' panicked at 'not implemented: escape_ unicode is not yet implemented', src/lib.rs:50:5 stack backtrace: 0: rust_begin_unwind at /usr/src/rustc-1.59.0/library/std/src/panicking.rs:498:5 1: core::panicking::panic_fmt at /usr/src/rustc-1.59.0/library/core/src/panicking.rs:116:14 2: backslash::escape_unicode at /usr/share/cargo/registry/backslash-0.2.0/src/lib.rs:50:5 3: backslash::tests::test_process_escapes::test_unicode_crab_emoji at /usr/share/cargo/registry/backslash-0.2.0/src/lib.rs:219:17 4: backslash::tests::test_process_escapes::test_unicode_crab_emoji::{{closure}} at /usr/share/cargo/registry/backslash-0.2.0/src/lib.rs:216:9 5: core::ops::function::FnOnce::call_once at /usr/src/rustc-1.59.0/library/core/src/ops/function.rs:227:5 6: core::ops::function::FnOnce::call_once at /usr/src/rustc-1.59.0/library/core/src/ops/function.rs:227:5 note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace. ---- tests::test_process_escapes::test_unicode_u7fff stdout ---- thread 'tests::test_process_escapes::test_unicode_u7fff' panicked at 'not implemented: escape_unico de is not yet implemented', src/lib.rs:50:5 stack backtrace:

    opened by franklintimoteo 2
Releases(v1.3.4)
Owner
Ryan Geary
Ryan Geary
Grep with human-friendly search output

hgrep: Human-friendly GREP hgrep is a grep tool to search files with given pattern and print the matched code snippets with human-friendly syntax high

Linda_pp 346 Nov 19, 2022
A simple, human-friendly, embeddable scripting language

Mica Language reference · Rust API A simple, human-friendly scripting language, developed one feature at a time. Human-friendly syntax inspired by Rub

Mica programming language 22 Nov 17, 2022
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find

fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find. While it does not aim to support all of find's powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.

David Peter 25.4k Nov 24, 2022
Codemod - Codemod is a tool/library to assist you with large-scale codebase refactors that can be partially automated but still require human oversight and occasional intervention

Codemod - Codemod is a tool/library to assist you with large-scale codebase refactors that can be partially automated but still require human oversight and occasional intervention. Codemod was developed at Facebook and released as open source.

Meta Archive 4k Dec 1, 2022
Fuzzy Index for Python, written in Rust. Works like error-tolerant dict, keyed by a human input.

FuzzDex FuzzDex is a fast Python library, written in Rust. It implements an in-memory fuzzy index that works like an error-tolerant dictionary keyed b

Tomasz bla Fortuna 8 Sep 15, 2022
Human numeric sorting program — does what `sort -h` is supposed to do!

hns — Human Numeric Sort v0.1.0 (⏫︎2022-09-20) © 2022 Fredrick R. Brennan and hns Authors Apache 2.0 licensed, see LICENSE. man page Packages hns_0.1.

Fredrick Brennan 7 Sep 25, 2022
Display file sizes in human-readable units

hsize Display file sizes in human-readable units $ hsize 1000 1000000 5000000 1.00 KB 1.00 MB 5.00 MB $ hsize -p 5 1048576 12345678 1.04858 MB 12.345

Ryan 2 Nov 21, 2022
⚡ A Blazing fast alternative to the stock windows folder delete function!

Turbo Delete A blazing fast alternative to the default Windows delete. Turbodelete is a blazing fast alternative to the default Windows delete functio

Tejas Ravishankar 166 Dec 2, 2022
Bonk - The blazingly fast touch alternative written in rust

Bonk The blazingly fast touch alternative written in rust. Made for the sole purpose to create files. Explore the docs » View Demo · Report Bug · Requ

Elliot 71 Nov 4, 2022
A user-friendly TUI for secure file transfers, with arrow-key and VIM-style navigation

gsftp SFTP with an interactive text-based user interface (TUI). Transfer files through an encrypted connection with a visual interface, so you can see

Ben Jiron 3 Jul 7, 2022
A user-friendly TUI client for Matrix written in Rust!

Konoha A user-friendly TUI client for Matrix written in Rust! Notice: The client is currently not usable and is only hosted on GitHub for version cont

L3af 9 Jan 5, 2022
UnixString is An FFI-friendly null-terminated byte string

UnixString is an FFI-friendly null-terminated byte string that may be constructed from a String, a CString, a PathBuf, an OsString or a collection of bytes.

Vinícius Miguel 20 Apr 14, 2022
A user-friendly re-implementation of existing hex tools in Rust

Hex A project to create alternate (and more user friendly) versions of existing hex tools. The project can be installed as a extension to the github-c

Sohom Datta 6 Sep 27, 2022
OSINT from your favorite services in a friendly terminal user interface

osintui Open Source Intelligence Terminal User Interface Report Bug · Request Feature Installation First, install Rust (using the recommended rustup i

Will Sheldon 625 Nov 21, 2022
Simple low-level web server to serve file uploads with some shell scripting-friendly features

http_file_uploader Simple low-level web server to serve file uploads with some shell scripting-friendly features. A bridge between Web's multipart/for

Vitaly Shukela 2 Oct 27, 2022
`ls` alternative with useful info and a splash of color 🎨

?? Natls ?? Why Natls? Showing file permissions Showing file size Showing the date that the file was modified last Showing the user that the file belo

Will 1.2k Nov 23, 2022
Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. A tokei/scc/cloc alternative.

tcount (pronounced "tee-count") Count your code by tokens, types of syntax tree nodes, and patterns in the syntax tree. Quick Start Simply run tcount

Adam P. Regasz-Rethy 49 Nov 24, 2022
Faster and better alternative to Vtop written in Rust.

Rtop Faster and better alternative to Vtop written in Rust. Work in Progress Features Lightweight < 1MB Responsive UI Sort Process by Memory, CPU Usag

Squitch 7 Nov 18, 2022
Lightweight alternative Discord client with a smaller footprint and some fancy extensible features.

Dorion Dorion is an alternative Discord client aimed and lower-spec or storage-sensitive PCs that supports themes, plugins, and more! Table of Content

SpikeHD 16 Nov 24, 2022