I’m not sure many web developers can get away without visiting the command line. As for me, I’ve been using the command line since 1997, first at university when I felt both super cool l33t-hacker and simultaneously utterly out of my depth.

Over the years my command line habits have improved and I often search for smarter tools for the jobs I commonly do. With that said, here’s my current list of improved CLI tools.

[I’ve published 38 videos for new developers, designers, UX, UI, product owners and anyone who needs to conquer the command line today.](https://training.leftlogic.com/buy/terminal/cli2?coupon=BLOG\&utm_source=blog\&utm_medium=banner\&utm_campaign=remysharp-discount)

Ignoring my improvements[](#ignoring-my-improvements)

In a number of cases I’ve aliased the new and improved command line tool over the original (as with cat and ping).

If I want to run the original command, which is sometimes I do need to do, then there’s two ways I can do this (I’m on a Mac so your mileage may vary):

$ \cat # ignore aliases named "cat" - explanation: https://stackoverflow.com/a/16506263/22617
$ command cat # ignore functions and aliases

bat > cat[](#bat—​cat)

cat is used to print the contents of a file, but given more time spent in the command line, features like syntax highlighting come in very handy. I found [ccat](https://github.com/jingweno/ccat) which offers highlighting then I found [bat](https://github.com/sharkdp/bat) which has highlighting, paging, line numbers and git integration.

The bat command also allows me to search during output (only if the output is longer than the screen height) using the / key binding (similarly to less searching).

![Simple bat output](/images/cli-improved/bat.gif "Sample bat output")

I’ve also aliased bat to the cat command:

$ alias cat='bat'

💾 [Installation directions](https://github.com/sharkdp/bat)

prettyping > ping[](#prettyping—​ping)

ping is incredibly useful, and probably my goto tool for the "oh crap is X down/does my internet work!!!". But prettyping ("pretty ping" not "pre typing"!) gives ping a really nice output and just makes me feel like the command line is a bit more welcoming.

![/images/cli-improved/ping.gif](/images/cli-improved/ping.gif "Sample ping output")

I’ve also aliased ping to the prettyping command:

$ alias ping='prettyping --nolegend'

💾 [Installation directions](http://denilson.sa.nom.br/prettyping/)

fzf > ctrl+r[](#fzf—​ctrlr)

In the terminal, using ctrl+r will allow you to [search backwards](https://lifehacker.com/278888/ctrl%252Br-to-search-and-other-terminal-history-tricks) through your history. It’s a nice trick, albeit a bit fiddly.

The fzf tool is a huge enhancement on ctrl+r. It’s a fuzzy search against the terminal history, with a fully interactive preview of the possible matches.

In addition to searching through the history, fzf can also preview and open files, which is what I’ve done in the video below:

For this preview effect, I created an alias called preview which combines fzf with bat for the preview and a custom key binding to open VS Code:

$ alias preview="fzf --preview 'bat --color \"always\" {}'"
# add support for ctrl+o to open selected file in VS Code
export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"

💾 [Installation directions](https://github.com/junegunn/fzf)

htop > top[](#htop—​top)

top is my goto tool for quickly diagnosing why the CPU on the machine is running hard or my fan is whirring. I also use these tools in production. Annoyingly (to me!) top on the Mac is vastly different (and inferior IMHO) to top on linux.

However, htop is an improvement on both regular top and crappy-mac top. Lots of colour coding, keyboard bindings and different views which have helped me in the past to understand which processes belong to which.

Handy key bindings include:

  • P - sort by CPU

  • M - sort by memory usage

  • F4 - filter processes by string (to narrow to just "node" for instance)

  • space - mark a single process so I can watch if the process is spiking

![htop output](/images/cli-improved/htop.jpg "Sample htop output")

There is a weird bug in Mac Sierra that can be overcome by running htop as root (I can’t remember exactly what the bug is, but this alias fixes it - though annoying that I have to enter my password every now and again):

$ alias top="sudo htop" # alias top and fix high sierra bug

💾 [Installation directions](http://hisham.hm/htop/)

diff-so-fancy > diff[](#diff-so-fancy—​diff)

I’m pretty sure I picked this one up from Paul Irish some years ago. Although I rarely fire up diff manually, my git commands use diff all the time. diff-so-fancy gives me both colour coding but also character highlight of changes.

![diff so fancy](/images/cli-improved/diff-so-fancy.jpg "Sample diff output")

Then in my ~/.gitconfig I have included the following entry to enable diff-so-fancy on git diff and git show:

[pager]
       diff = diff-so-fancy | less --tabs=1,5 -RFX
       show = diff-so-fancy | less --tabs=1,5 -RFX

💾 [Installation directions](https://github.com/so-fancy/diff-so-fancy)

fd > find[](#fd—​find)

Although I use a Mac, I’ve never been a fan of Spotlight (I found it sluggish, hard to remember the keywords, the database update would hammer my CPU and generally useless!). I use [Alfred](https://www.alfredapp.com/) a lot, but even the finder feature doesn’t serve me well.

I tend to turn the command line to find files, but find is always a bit of a pain to remember the right expression to find what I want (and indeed the Mac flavour is slightly different non-mac find which adds to frustration).

fd is a great replacement (by the same individual who wrote bat). It is very fast and the common use cases I need to search with are simple to remember.

A few handy commands:

$ fd cli # all filenames containing "cli"
$ fd -e md # all with .md extension
$ fd cli -x wc -w # find "cli" and run `wc -w` on each file

![fd output](/images/cli-improved/fd.png "Sample fd output")

💾 [Installation directions](https://github.com/sharkdp/fd/)

ncdu > du[](#ncdu—​du)

Knowing where disk space is being taking up is a fairly important task for me. I’ve used the Mac app [Disk Daisy](https://daisydiskapp.com/) but I find that it can be a little slow to actually yield results.

The du -sh command is what I’ll use in the terminal (-sh means summary and human readable), but often I’ll want to dig into the directories taking up the space.

ncdu is a nice alternative. It offers an interactive interface and allows for quickly scanning which folders or files are responsible for taking up space and it’s very quick to navigate. (Though any time I want to scan my entire home directory, it’s going to take a long time, regardless of the tool - my directory is about 550gb).

Once I’ve found a directory I want to manage (to delete, move or compress files), I’ll use the cmd + click the pathname at the top of the screen in [iTerm2](https://www.iterm2.com/) to launch finder to that directory.

![ncdu output](/images/cli-improved/ncdu.png "Sample ncdu output")

There’s another [alternative called nnn](https://github.com/jarun/nnn) which offers a slightly nicer interface and although it does file sizes and usage by default, it’s actually a fully fledged file manager.

My ncdu is aliased to the following:

$ alias du="ncdu --color dark -rr -x --exclude .git --exclude node_modules"

The options are:

  • --color dark - use a colour scheme

  • -rr - read-only mode (prevents delete and spawn shell)

  • --exclude ignore directories I won’t do anything about

💾 [Installation directions](https://dev.yorhel.nl/ncdu)

tldr > man[](#tldr—​man)

It’s amazing that nearly every single command line tool comes with a manual via man <command>, but navigating the man output can be sometimes a little confusing, plus it can be daunting given all the technical information that’s included in the manual output.

This is where the TL;DR project comes in. It’s a community driven documentation system that’s available from the command line. So far in my own usage, I’ve not come across a command that’s not been documented, but you can [also contribute too](https://github.com/tldr-pages/tldr#contributing).

![TLDR output for 'fd'](/images/cli-improved/tldr.png "Sample tldr output for 'fd'")

As a nicety, I’ve also aliased tldr to help (since it’s quicker to type!):

$ alias help='tldr'

💾 [Installation directions](http://tldr-pages.github.io/)

ack || ag > grep[](#ack—​ag—​grep)

grep is no doubt a powerful tool on the command line, but over the years it’s been superseded by a number of tools. Two of which are ack and ag.

I personally flitter between ack and ag without really remembering which I prefer (that’s to say they’re both very good and very similar!). I tend to default to ack only because it rolls of my fingers a little easier. Plus, ack comes with the mega ack --bar argument (I’ll let you experiment)!

Both ack and ag will (by default) use a regular expression to search, and extremely pertinent to my work, I can specify the file types to search within using flags like --js or --html (though here ag includes more files in the js filter than ack).

Both tools also support the usual grep options, like -B and -A for before and after context in the grep.

![ack in action](/images/cli-improved/ack.png "Sample ack output with grep args")

Since ack doesn’t come with markdown support (and I write a lot in markdown), I’ve got this customisation in my ~/.ackrc file:

--type-set=md=.md,.mkd,.markdown
--pager=less -FRX

💾 Installation directions: [ack](https://beyondgrep.com), [ag](https://github.com/ggreer/the_silver_searcher)

[Futher reading on ack & ag](http://conqueringthecommandline.com/book/ack_ag)

jq > grep et al[](#jq—​grep-et-al)

I’m a massive fanboy of [jq](https://stedolan.github.io/jq). At first I struggled with the syntax, but I’ve since come around to the query language and use jq on a near daily basis (whereas before I’d either drop into node, use grep or use a tool called [json](http://trentm.com/json/) which is very basic in comparison).

I’ve even started the process of writing a jq tutorial series (2,500 words and counting) and have published a [web tool](https://jqterm.com) and a native mac app (yet to be released).

jq allows me to pass in JSON and transform the source very easily so that the JSON result fits my requirements. One such example allows me to update all my node dependencies in one command (broken into multiple lines for readability):

$ npm i $(echo $(\
  npm outdated --json | \
  jq -r 'to_entries | .[] | "\(.key)@\(.value.latest)"' \
))

The above command will list all the node dependencies that are out of date, and use npm’s JSON output format, then transform the source JSON from this:

{
  "node-jq": {
    "current": "0.7.0",
    "wanted": "0.7.0",
    "latest": "1.2.0",
    "location": "node_modules/node-jq"
  },
  "uuid": {
    "current": "3.1.0",
    "wanted": "3.2.1",
    "latest": "3.2.1",
    "location": "node_modules/uuid"
  }
}

…to this:

node-jq@1.2.0
uuid@3.2.1

That result is then fed into the npm install command and voilà, I’m all upgraded (using the sledgehammer approach).

Honourable mentions[](#honourable-mentions)

Some of the other tools that I’ve started poking around with, but haven’t used too often (with the exception of ponysay, which appears when I start a new terminal session!):

What about you?[](#what-about-you)

So that’s my list. How about you? What daily command line tools have you improved? I’d love to know.

Published 23-Aug 2018 under #web. [Edit this post](https://github.com/remy/remysharp.com/blob/main/public/blog/cli-improved.md)

👍 61 likes

[![José Ríos](/images/no-user.svg "José Ríos")](![litenjacob(/images/no-user.svg "litenjacob")](![Anthony Young(/images/no-user.svg "Anthony Young")](![Martin Pitt(/images/no-user.svg "Martin Pitt")](![Dana Johnson(/images/no-user.svg "Dana Johnson")](![me_atdiv(/images/no-user.svg "me_atdiv")](![rong-sen(/images/no-user.svg "rong-sen")](![Αρτυρ Jansons(/images/no-user.svg "Αρτυρ Jansons")](![Andrew Gallant(/images/no-user.svg "Andrew Gallant")](![Rayy(/images/no-user.svg "Rayy")](![David Hund ✌(/images/no-user.svg "David Hund ✌")](![stonecobra(/images/no-user.svg "stonecobra")](![Amine(/images/no-user.svg "Amine")](![Tobias Ahlin(/images/no-user.svg "Tobias Ahlin")](![Paul Watson 🇿🇦 🇮🇪(/images/no-user.svg "Paul Watson 🇿🇦 🇮🇪")](![Jesus Monzon(/images/no-user.svg "Jesus Monzon")](![Andy Bell - on holiday 🏖 🇬🇷(/images/no-user.svg "Andy Bell - on holiday 🏖 🇬🇷")](![eduard(/images/no-user.svg "eduard")](![Sirajul Muneer(/images/no-user.svg "Sirajul Muneer")](![Lorenz 🐧(/images/no-user.svg "Lorenz 🐧")](![Armand du Plessis(/images/no-user.svg "Armand du Plessis")](![Calvsie king thereof(/images/no-user.svg "Calvsie king thereof")](![Torben Höhn(/images/no-user.svg "Torben Höhn")](![Connor(/images/no-user.svg "Connor")](![Peter Guntrip(/images/no-user.svg "Peter Guntrip")](![Uldis Bojars(/images/no-user.svg "Uldis Bojars")](![Dugan Chen(/images/no-user.svg "Dugan Chen")](![Daniel Schildt(/images/no-user.svg "Daniel Schildt")](![Jit Gosai(/images/no-user.svg "Jit Gosai")](![Ben Everard(/images/no-user.svg "Ben Everard")](![Thanh Trần(/images/no-user.svg "Thanh Trần")](![Rohan Bhanderi(/images/no-user.svg "Rohan Bhanderi")](![Benjamin Hollway(/images/no-user.svg "Benjamin Hollway")](![Kevin Chappell(/images/no-user.svg "Kevin Chappell")](![Raja Kannan 🤠(/images/no-user.svg "Raja Kannan 🤠")](![uk(/images/no-user.svg "uk")](![Raphael Fetzer(/images/no-user.svg "Raphael Fetzer")](![Grazfather(/images/no-user.svg "Grazfather")](![Newton Ni(/images/no-user.svg "Newton Ni")](![Sven Ridder(/images/no-user.svg "Sven Ridder")](![Juan Rossi 💚(/images/no-user.svg "Juan Rossi 💚")](![Daniel Bellomo(/images/no-user.svg "Daniel Bellomo")](![Anthony Floyd(/images/no-user.svg "Anthony Floyd")](![J.F. Zarama(/images/no-user.svg "J.F. Zarama")](![Senfomat(/images/no-user.svg "Senfomat")](![clacke@libranet.de ❌(/images/no-user.svg "clacke@libranet.de ❌")](![.(/images/no-user.svg ".")](![Irene Yoon(/images/no-user.svg "Irene Yoon")](![Remote Teams PLOW(/images/no-user.svg "Remote Teams PLOW")](![sidasa(/images/no-user.svg "sidasa")](![andrew.james(/images/no-user.svg "andrew.james")](![Ramazan A.(/images/no-user.svg "Ramazan A.")](![Purusottam Digal(/images/no-user.svg "Purusottam Digal")](![Juang Wiantoro 🐪(/images/no-user.svg "Juang Wiantoro 🐪")](![Ivan Alejandro(/images/no-user.svg "Ivan Alejandro")](![Jenn Voss(/images/no-user.svg "Jenn Voss")](![Seth Messer(/images/no-user.svg "Seth Messer")](![Javier Infante(/images/no-user.svg "Javier Infante")](![Varun Ravishankar(/images/no-user.svg "Varun Ravishankar")](![Skunnyk(/images/no-user.svg "Skunnyk")](![David D. Warden(/images/no-user.svg "David D. Warden")](https://twitter.com/daviddwarden)

Comments

Lock Thread

Login

Add Comment[M ↓   Markdown]()

[Upvotes]()[Newest]()[Oldest]()

Esmaeil Khaksari

0 points

21 months ago

Fantastic post. I’m wondering if you see an easy way to setup the preview (fzf/bat), depending on whether the file is a binary or a text type file. For instance there are means for generating images at the CLI https://iterm2.com/documentation-images.html

2 points

4 years ago

Great list.

An even better tool than ack and ag is pt - same idea, different implementation (this one’s in either Go or C++, but in any case a binary). The best thing is that it’s actually documented, unlike ag where I always end up spending hours trying to work out how those regex exclude patterns work.

![](/images/no-user.svg)[Monster](https://clipartkind.com/clipart/monster-clipart-264/)

0 points

3 years ago

great post, i also liked the looks of your shell console where can i find it?

![](/images/no-user.svg)

Philipp Hanslovsky

0 points

4 years ago

Great stuff, ncdu is amazing! I’ve also become a huge fan of jq, it’s even available on Arch Linux through the standard repositories.

![](/images/no-user.svg)

Crazygit

0 points

5 years ago

Thanks for sharing!

![](/images/no-user.svg)

Oliver Kaufmann

0 points

5 years ago

What’s the name of this zsh theme? Looks like agnoster with cursor on newline?

![](/images/no-user.svg)

Oliver Kaufmann

0 points

5 years ago

![](/images/no-user.svg)

BrahBassim

0 points

5 years ago

Thank’s a lot for this sharing…​.

![](/images/no-user.svg)

Birkhoff Lee

0 points

5 years ago

Thanks you for sharing :)

![](/images/no-user.svg)

Felipe Lavín

0 points

5 years ago

Hi!

Another good enhanced command-line tool it’s https://www.mycli.net/

![](/images/no-user.svg)

Drew

0 points

5 years ago

Excellent post!

![](/images/no-user.svg)

coloured\_chalk

0 points

5 years ago

Thank you for the article!\ Got many tools in my favs

![](/images/no-user.svg)

Jiri

0 points

5 years ago

You are definitely missing one tool - GBT - Highly configurable prompt builder for Bash and ZSH written in Go! Not only that it allows you to have beautiful and blazing fast prompt on your local machine but it also allows you to forward the prompt on any remote machine! Like that you can have the same-looking prompt via SSH, in Docker, Vagrant, MySQL or Screen and also via SUDO or SU!

![](/images/no-user.svg)

Jaques Grobler

0 points

5 years ago

This pleases me greatly — thank you!

![](/images/no-user.svg)

Ryan Sandridge

0 points

5 years ago

pgcli > psql

![](/images/no-user.svg)

Jakub Jankiewicz

0 points

5 years ago

You should try gron if you need processing json, I don’t use it a lot because I’m not parsing json that often but it’s nice tool [https://github.com/TomNomNo…​;](https://github.com/TomNomNom/gron)

![](/images/no-user.svg)

harelba

0 points

5 years ago

[q](http://harelba.github.io/q/) is a command line tool which allows running full blown sql commands over text data

![](/images/no-user.svg)

Daniel Rivero

0 points

5 years ago

This is great! Thank you so much for this article. I already use some of\ this upgraded alternatives. I could suggest glances\ ([https://github.com/nicolarg…​;](https://github.com/nicolargo/glances)) as an alternative to top. And gping ([https://github.com/orf/gping)](https://github.com/orf/gping)) to ping.

![](/images/no-user.svg)

Ricardo Pietrobon

0 points

5 years ago

ag > fd

![](/images/no-user.svg)

whobutsb

0 points

5 years ago

Love these articles and learning about new CLI tools. I’m a big fan of autojump - [https://github.com/wting/au…​;](https://github.com/wting/autojump). It allows me easily navigate around to commonly opened directories. Example: $ j desk - changes directory to ~/Desktop.

![](/images/no-user.svg)

Xing Fang

0 points

5 years ago

![](/images/no-user.svg)

Marcos Ellys

0 points

5 years ago

Thank you, nice article

![](/images/no-user.svg)

jackbravo

0 points

5 years ago

tig is a great compliment for git. Here is a nice post about it: [https://www.atlassian.com/b…​;](https://www.atlassian.com/blog/git/git-tig)

![](/images/no-user.svg)

Romain Norberg

0 points

5 years ago

Thank you for the list! Check this article: "Use .bashrc.d directory instead of bloated .bashrc" [https://medium.com/@waxzce/…​;](https://medium.com/@waxzce/use-bashrc-d-directory-instead-of-bloated-bashrc-50204d5389ff)

![](/images/no-user.svg)

bsagert

0 points

5 years ago

Besides \cat and command cat to circumvent its alias, you can also use /bin/cat

![](/images/no-user.svg)

Philippe

0 points

5 years ago

ripgrep > ag :)

![](/images/no-user.svg)

teowood

0 points

5 years ago

great post, i also liked the looks of your shell console where can i find it?\ [https://remysharp.com/image…​;](https://remysharp.com/images/cli-improved/fd.png)

![](/images/no-user.svg)

Mourner

0 points

5 years ago

A few of my favorites that were not mentioned:

![](/images/no-user.svg)

notdavid

0 points

5 years ago

The problem with FZF is that it uses bash "history" - which sucks badly, which is why i switched to HISTORIAN instead. Historian doesn’t forget any history…​!\ [https://github.com/jcsalter…​;](https://github.com/jcsalterego/historian)

(and yes i have tried finetuning history with things like HISTSIZE, HISTFILESIZE, histappend etc. but all of them have shortcomings.)

![](/images/no-user.svg)

Vizay Soni

0 points

5 years ago

I would also include:

![](/images/no-user.svg)

fabienZ

1 point

5 years ago

fish > bash (life changer)

![](/images/no-user.svg)

Mateus Rodrigues

0 points

5 years ago

zsh > fish > bash

sorry people, for heavy shell users I think fish is not the way to go. Just try to test fish this weekend and some conventions changed like && to and can be deal breakers for some users. I had to install a plugin to use !!. Amazing autocompletion, but I could get the exactly same thing with oh-my-zsh plugin for it.

Can you custome fish to have everything like this? Yep, for sure, but then what’s the purpose?

![](/images/no-user.svg)

Joey Žaba Sabey

0 points

4 years ago

I personally prefer fish to zsh+oh-my-zsh, as oh-my-zsh doesn’t (yet) seem to have all the features I use in fish (such as abbr, last I checked), and seems more sluggish than fish.

(As a side note you’ve been able to use && and || in fish for like a year now iirc, though it’s still not a POSIX shell and still won’t do everything the way BASH does)

![](/images/no-user.svg)

fabienZ

0 points

5 years ago

Yeah there is some differences in syntax, but, for me anyway, this is not a big deal. IMHO I find zsh + oh-my a bit bloated (no offense).\ It is a matter of taste I suppose :)

![](/images/no-user.svg)

verboze

0 points

5 years ago

I agree oh-my-zsh is bloated. It’s a simple and great starting point to customizing zsh. I used if for a couple of months, then switched to zplug ([https://github.com/zplug/zp…​;](https://github.com/zplug/zplug)) better plugin management. Blazing fast, and with no discernible overhead over pure zsh when configured properly. Fish didn’t work for me because I sometimes need to port my config to bash environments (where I have no control over the shell); this is much easier to do from zsh to bash than from fish to bash.

![](/images/no-user.svg)

Shinra

0 points

5 years ago

fish is life-changing

![](/images/no-user.svg)

ReneFroger

-1 points

5 years ago

This, especially the autocompletion suggestions with FZF.

![](/images/no-user.svg)

chetzof

0 points

5 years ago

![](/images/no-user.svg)

rem

0 points

5 years ago

![](/images/no-user.svg)

Olivier Drevet

0 points

5 years ago

There should be a new 'standard' that includes those newer command line tools so they can be used and shipped in scripts by sysadmin

![](/images/no-user.svg)

herhor

1 point

5 years ago

your fancy diff looks fancy, but I prefer a side-by-side view, hence "icdiff > git diff" for me ([https://www.jefftk.com/icdiff)](https://www.jefftk.com/icdiff))

![](/images/no-user.svg)

Arthur Toumassian

0 points

5 years ago

Thank you for the list

  • ccze for logs

![](/images/no-user.svg)

Ronny Haryanto

0 points

5 years ago

less, then F > tail -f

Thanks for the post!

![](/images/no-user.svg)

Amos S

0 points

5 years ago

"less +F" > "less, then F" ;)

![](/images/no-user.svg)

Gregor

0 points

5 years ago

I use jp instead of jq: https://github.com/jmespath/jp

Its syntax follows a published standard instead of being home grown (it also 'clicks' with me more) and I’ve been burned once or twice by jq’s handling of large numbers (it converts them to single precision float and loses precision even if they are whole numbers which is not what I expected when dealing with long identifiers).

I also find scm\_breeze very handy: [https://github.com/scmbreez…​;](https://github.com/scmbreeze/scm_breeze) (it assigns aliases to files returned by 'git status' or similar commands so you can reference them easier in later commands).

And last but certainly not least, oh-my-zsh offers a whole smorgasbord of useful tweaks and utilities (really, that thing touches everything): [https://github.com/robbyrus…​;](https://github.com/robbyrussell/oh-my-zsh)

![](/images/no-user.svg)

Ruben Gonzalez Gonzalez

0 points

5 years ago

autojump > cd

![](/images/no-user.svg)

Ricardo Pietrobon

0 points

5 years ago

fasd > autojump

![](/images/no-user.svg)

Olivier Refalo

0 points

5 years ago

agreed, autojump’s so old.\ Recently trashed z for fasd. like it so far.

![](/images/no-user.svg)

Seth Messer

-1 points

5 years ago

were you able to migrate your z-history to fasd’s use?

![](/images/no-user.svg)

Hank Chan

0 points

5 years ago

z is somewhat similar to autojump.

![](/images/no-user.svg)

Xell Liu

0 points

5 years ago

Thank you!

![](/images/no-user.svg)

bing jing

0 points

5 years ago

Extended your preview command:

alias preview="fzf --height 40% --preview 'if file -i {}|grep -q binary; then file -b {}; else bat --color "always" --line-range :40 {}; fi'"

![](/images/no-user.svg)

LIB53

0 points

5 years ago

HTTPie > curl\ I recommend using a different HTTP client than curl. While curl gets the job done, it can be a bit hairy to build your command. HTTPie is easy to use.

Also, I recently switched to Fish from Zsh, people should give it a try.

![](/images/no-user.svg)

Gerard Gerry Caulfield

0 points

5 years ago

httpie > curl\ https://httpie.org/

![](/images/no-user.svg)

lujaw

0 points

5 years ago

Awesome list, thanks for sharing.\ I will chip in with https://github.com/clvv/fasd for directory navigation. Have been using for years, its great.

![](/images/no-user.svg)

Managed Kaos

0 points

5 years ago

Thanks for this round up! Some tools I know and use, and others that I am installing even as you read this! :D

If you work with CSV files and/or spreadsheets, a great CLI tool is scim: [https://github.com/andmarti…​;](https://github.com/andmarti1424/sc-im)

Its a terminal based col/row editor that has VIM bindings. I will admit it takes some getting used to but its great for editing CSVs without having to open up Excel! :)

![](/images/no-user.svg)

montes

0 points

5 years ago

Very nice post!

Add this! > https://httpie.org/

I use it a lot to check webs headers, redirects and things like that

![](/images/no-user.svg)

Johan Petersson

0 points

5 years ago

I developed fselect [https://github.com/jhspeter…​;](https://github.com/jhspetersson/fselect) as a fat replacement for find. Search files with SQL is fun and profit, if you want some complex queries. And it became extremely useful to sort and manage all that downloaded stuff which was there for ages :)

![](/images/no-user.svg)

Olivier Refalo

0 points

5 years ago

A replacement for ls --color\ [https://github.com/acarl005…​;](https://github.com/acarl005/ls-go)\ Just better…​

For colored man pages, I use\ [https://github.com/patrickf…​;](https://github.com/patrickf3139/Colored-Man-Pages)\ but it only works with Fishshell

![](/images/no-user.svg)

foljs

1 point

5 years ago

Instead of ag I’d suggest rg — and that guy also have several useful programs (in Rust)

![](/images/no-user.svg)

Fortran

0 points

5 years ago

Indeed. ripgrep is my go to for grepping nowadays. Crazy fast!

![](/images/no-user.svg)

kyranjamie

0 points

5 years ago

Great list. I’d chip in with ranger: [https://github.com/ranger/r…​;](https://github.com/ranger/ranger) Tool for navigating directory structure with vim bindings. Bound cdr to auto cd into the directory you quit ranger on (not default behaviour). Nicer than cd, ls-ing.

![](/images/no-user.svg)

Danno

0 points

5 years ago

You’ve highlighted a couple of pretty nifty Rust implemented tools like bat and fd. And I see a number of people have suggested ripgrep. There’s one more you might like to look at: exa, a replacement for ls.

![](/images/no-user.svg)

yoda\_huang

1 point

5 years ago

I would recommend exa ([https://the.exa.website/)](https://the.exa.website/)) for replacement of ls. Not a exact replacement, but good enough.

![](/images/no-user.svg)

Lazza

0 points

5 years ago

Indeed. My aliases are:

alias ls="exa" alias ll="exa -lh" alias la="exa -lhaa"

![](/images/no-user.svg)

Giacomo Debidda

0 points

5 years ago

I knew ag and jq, but never tried bat and tldr. Cool!\ I totally recommend this book if you are into CLI for data science.\ [https://www.datascienceatth…​;](https://www.datascienceatthecommandline.com/)

![](/images/no-user.svg)

steven\_noble

0 points

5 years ago

TLDR + man + syntax highlighting:

export LESS=-RXFi\ export LESS\_TERMCAP\_mb=$(printf "\e\[1;31m")\ export LESS\_TERMCAP\_md=$(printf "\e\[1;31m")\ export LESS\_TERMCAP\_me=$(printf "\e\[0m")\ export LESS\_TERMCAP\_se=$(printf "\e\[0m")\ export LESS\_TERMCAP\_so=$(printf "\e\[1;44;33m")\ export LESS\_TERMCAP\_ue=$(printf "\e\[0m")\ export LESS\_TERMCAP\_us=$(printf "\e\[1;32m")

help() { tldr "$@" && env man "$@"}

![](/images/no-user.svg)

Héctor M. Monacci

0 points

5 years ago

May I suggest to give xsv a try? Works wonders with text files as DBs from the CLI.

![](/images/no-user.svg)

Arne Babenhauserheide

1 point

5 years ago

I’ve replaced ag with ripgrep, because that’s roughly factor 3-4 faster (which is great if you have 1GiB of code to search).

![](/images/no-user.svg)

Michal Przybylowicz

0 points

5 years ago

Thank You for suggesting rg is seems to be really faster than ag !

![](/images/no-user.svg)

foljs

0 points

5 years ago

And better at following .gitignore files and such as well — also better with unicode

![](/images/no-user.svg)

林煜家

0 points

5 years ago

thanks 👍!

![](/images/no-user.svg)

Theodore Keloglou

0 points

5 years ago

Trying to set up fzf. Is it supposed to come up when hitting Ctrl-R? I can only access the file finder when calling fzf from the command line.

![](/images/no-user.svg)

Win

0 points

5 years ago

if you use vim, it’s also helpful. XD

![](/images/no-user.svg)

rem

0 points

5 years ago

Did you also install the key bindings?

![](/images/no-user.svg)

Theodore Keloglou

0 points

5 years ago

I did. So it is supposed to come up on Ctrl-R. Well, probably it conflicts with my other shortcuts and bash tweaks.

![](/images/no-user.svg)

Bart Dorlandt

0 points

5 years ago

I had the same when I downloaded the fzf standalone. Once I ran the install script it was doing wonders. (using zsh btw)

![](/images/no-user.svg)

lenswipe

0 points

5 years ago

I’d like to know what shell you’re using

![](/images/no-user.svg)

rem

0 points

5 years ago

I’m using zsh. Some details here: [https://remysharp.com/2013/…​;](https://remysharp.com/2013/07/25/my-terminal-setup) - otherwise you can see a LOT of details in my terminal course: https://terminal.training

![](/images/no-user.svg)

lenswipe

0 points

5 years ago

Thanks, that’s interesting. This is probably a stupid question, but does it work on Linux?

![](/images/no-user.svg)

Gregor

0 points

5 years ago

It certainly does, I’m a happy user :)

![](/images/no-user.svg)

Gonéri Le Bouder

1 point

5 years ago

You may also like Fish shell instead of Bash. You will never use C^r after.

![](/images/no-user.svg)

rem

0 points

5 years ago

Fish is great - for me personally, I couldn’t get on with it - a little too high level.

![](/images/no-user.svg)

David Parks

0 points

5 years ago

Love this article!!!\ But: glances > htop\ By an order of magnitude!

![](/images/no-user.svg)

Baptiste Darthenay

0 points

5 years ago

Thanks! I’ll steal one of these for sure!\ I wonder if you tried rg (ripgrep) to replace ag or ack. Pretty fast, and that’s what use VS Code to search.

![](/images/no-user.svg)

rem

0 points

5 years ago

I’ve not tried rg yet, but seen a number of people recommending it after I published this, so definitely going to check it out 👍

![](/images/no-user.svg)

zx1986

0 points

5 years ago

![](/images/no-user.svg)

zx1986

0 points

5 years ago

thanks man!

![](/images/no-user.svg)

elrrrrrrr

0 points

5 years ago

👍

[Commento](https://commento.io)