Assorted less(1) tips
164 points
11 hours ago
| 13 comments
| blog.thechases.com
| HN
teeray
9 hours ago
[-]
Surprised they missed follow! It’s a bit odd to use, but once you get used to it it’s better than tail in many circumstances IMO. `less +F` starts less following stdin or whatever file argument you’ve provided. <C-c> breaks following, allowing you to search around a business-as-usual `less` session. Hitting `F` (that’s uppercase) starts following again. Yes, you can just start following within a session with `F` too if you forgot to add +F to the `less` invocation.
reply
joombaga
6 hours ago
[-]
With `tail` you can press enter a few times to put some empty lines after the last line. This is useful e.g. when you trigger a function multiple times and want to easily see line groups from each attempt. It's the only reason I still use `tail` for following when `less` is available.
reply
teeray
5 hours ago
[-]
A visual mark would be nice, agreed. I haven't tried it, but I wonder if you could approximate it with the bookmarking feature that less(1) does have. It wouldn't be visible, but it would scroll to a consistent mark.
reply
vladvasiliu
4 hours ago
[-]
I usually use tail when I need to do some ad-hoc log following.

Having to set bookmarks and remember them is a PITA I can usually do without. If I'm looking at "normal" log output, it's usually set up in a nice aggregator somewhere, where I can easily exclude noise and otherwise uninteresting output.

reply
CBLT
6 hours ago
[-]
If you're following a pipe (such as `kubectl logs | less +F`), <C-c> is sent to all processes in a pipeline, so it stops less from following and it stops the other process entirely. Then you can't start following again with F, or load more data in with G.

Less provides an alternative of <C-x> to stop following, but that is intercepted by most shells.

reply
vbezhenar
2 hours ago
[-]
> Less provides an alternative of <C-x> to stop following, but that is intercepted by most shells.

WoW, thanks a lot! That was my pain for many years. C-x works in Gnome Console just fine.

reply
mananaysiempre
2 hours ago
[-]
Funnily enough, it literally tells you right there on the bottom line: “Waiting for data... (^X or interrupt to abort)”. No shame in not noticing, just another case of blindness to long-familliar messages I guess.
reply
mananaysiempre
2 hours ago
[-]
By the shell or by the kernel’s terminal discipline or by the terminal emulator? AFAIU the shell is basically out of the picture while `less` is running.
reply
CBLT
40 minutes ago
[-]
I can <C-z> while less is running to background that process using the shell, so the shell is clearly not completely gone.

I might be misremembering, but I think I just had to rebind <C-x> in zsh to get less working.

reply
mananaysiempre
2 minutes ago
[-]
> I can <C-z> while less is running to background that process using the shell, so the shell is clearly not completely gone.

The shell isn’t gone, but it isn’t active either from what I understand. The function of converting the user’s typing ^Z on a terminal (or a ^Z arriving on the master end of a pseudoterminal) into a SIGTSTP signal to the terminal’s foreground process group is[1] a built-in function of the kernel, much like for ^C and SIGINT, or ^\ and SIGQUIT. (The use of ^Z resp. ^C or ^\ specifically is configurable, via an ioctl wrapped by termios wrapped in turn by `stty susp` resp. `stty intr` or `stty quit`.) So is the default signal action of stopping (i.e. suspending) the process in response to that signal. The shell just sees its waitpid() syscall return and handles the possibility of that happening due to the process stopping rather than dying (by updating its job bookkeeping, making itself the foreground process group again, and reëntering the REPL).

I am not saying that doing job control by filtering the child’s input would be a bad design in the abstract; just that it’s not how it’s traditionally done in a Unix system.

[1] https://www.gnu.org/software/libc/manual/html_node/Concepts-...

reply
obezyian
5 minutes ago
[-]
I think by "out of the picture" PP meant that the shell is not processing the input, not that it has exited.

C-z is not processed by the shell but by the terminal "infrastructure".

You can disable it, or change the key binding, and a lot more, with stty(1).

reply
xg15
5 hours ago
[-]
Maybe OT, but I thought for a long time that "follow" was some sophisticated file descriptor trickery that required you to somehow "stream" the file while reading and would therefore be incompatible with opening a file "normally".

My mind was blown when finding out its really just "keep on polling after EOF". Meaning there is absolutely no difference between opening a file normally and "following" a file - and software could easily switch between the two "modes" on the fly.

reply
layer8
7 hours ago
[-]
It would be nice to have a mode that follows in the sense of automatically picking up new output, but that simultaneously would let you navigate around, similar to how terminals behave. Then you’d only need an autoscroll toggle for when you’re at the bottom.
reply
gerdesj
6 hours ago
[-]
Take a look at "lnav" ...
reply
sprt
9 hours ago
[-]
I'm so mad that I didn't know the hitting F thing!
reply
JayGuerette
9 hours ago
[-]
Also -X or --no-init

" ... desirable if the deinitialization string does something unnecessary, like clearing the screen."

I prefer to not clear the screen. I usually want to continue to refer to something or even copy/paste from the content to my current command line.

reply
Izkata
8 hours ago
[-]
And combined with -E, it'll quit immediately if the output is smaller than the terminal size.

...And combined with some of the other options in the post, my go-to has been "less -SEXIER" for a long time. Specifying E twice doesn't seem to do anything except make this easier to remember.

reply
jlokier
5 hours ago
[-]
I recommend -FX instead of -EX. They both quit immediately if the output is smaller than the screen size, but -FX does not quit if the output is larger and you jump to the end of a large file, so you can continue to do things like scroll back or search.

git uses "less -FRX" by default. This is how I learned about -F.

(To be pedentic, git uses "LESS=FRX less", which accomplishes the same thing.)

reply
marcosdumay
7 hours ago
[-]
I'm reading it correctly that it will cause less to exit if you scroll until the end of file even if the file is larger than the terminal size?
reply
Izkata
7 hours ago
[-]
Yeah; in both cases (text is larger or smaller than terminal) it makes "less" act the same as "more" with auto-exiting.
reply
kccqzy
6 hours ago
[-]
I hate -E. Quitting immediately does not do good things to my muscle memory. I’m using to hitting q to quit less when I am done. Now the q key becomes part of the input to the shell prompt (or worse if there’s a different tool invoking less and now q might be interpreted differently by that tool). I value the consistency of user interaction more than saving a keystroke.
reply
etra0
9 hours ago
[-]
The tip that I've been using quite a lot lately by debugging long log files is using `&` to filter what I want to read and `&!` to filter-out what's not useful (and they support regexes).

Admittedly, they are a bit slow sometime and sure, you could use `grep -v` then pipe which is way faster, but they've saved me on removing noise from logfiles from time to time when you don't always know what to filter beforehand :).

EDIT: It was in TFA.

reply
alkh
1 hour ago
[-]
Don't forget that you can enable syntax highlighting/file rendering(like pdf, markdown) in less with lesspipe https://github.com/wofr06/lesspipe. It is exteremely useful and improves readability a lot. What's nice is that this functionality is typically disabled in pipes, so you can be sure that your script will behave as intended.
reply
inejge
8 hours ago
[-]
Two things that have helped me a lot of times:

-L: skip preprocessing the input file. When opening rotated log files with the names like logfile.1, logfile.2... the default preprocessor on some distros will recognize them as man page source and helpfully pipe through nroff. If the file is largish this introduces an annoying pause. Using -L skips all that.

Ctrl-R as the first character of a search string will search for that literal string, not the regular expression. Nice if you have regex metacharacters in the search string and don't want to bother with escaping (and don't need the regex facilities, of course.)

reply
jez
8 hours ago
[-]
Less can be configured with a ~/.lesskey file

I have a single line in my config[1] which binds s to back-scroll, so that d and s are right next to each other and I can quickly page up/down with one hand.

If you’re on macOS, you may not be able to use this unless you install less from Homebrew, or otherwise replace the default less.[2]

[1] https://github.com/jez/dotfiles/blob/master/lesskey#L2

[2] https://apple.stackexchange.com/questions/27269/is-less1-mis...

reply
btdmaster
8 hours ago
[-]
You can also press `s` to save data from a pipe to a file rather than manually copy pasting.
reply
osmsucks
4 hours ago
[-]
I came here to suggest the same! It's incredibly handy and I use it all the time at work: there's a process that runs for a very long time and I can't be sure ahead of time if the output it generates is going to be useful or not, but if it's useful I want to capture it. I usually just pipe it into `less` and then examine the contents once it's done running, and if needed I will use `s` to save it to a file.

(I suppose I could `tee`, but then I would always dump to a file even if it ends up being useless output.)

reply
GuB-42
6 hours ago
[-]
> The ! lets you invoke an external command.

Also useful for privilege escalation...

If a script running as root uses less (or vi), just do "!bash" and you have a root shell. Note that systems that let you do this are usually pretty weak, and there are often many other ways to get root access, but this is a particularly simple one that I used a few times in the past.

reply
_delirium
5 hours ago
[-]
> I've got more less tips than the Bible's got Psalms

But there are (at least) 150 Psalms! You're going to need more less tips to match that.

reply
linhns
7 hours ago
[-]
I like less and found that https://github.com/noborus/ov can be a good modern alternative to it.
reply
kseistrup
5 hours ago
[-]
Another nice one is moor (née moar): https://github.com/walles/moor
reply
eitau_1
7 hours ago
[-]
Looks cool! Annoyingly less sometimes bugs out and starts spinning, have to kill it from the outside.
reply
eulgro
9 hours ago
[-]
Some of these come intuitively when you know how to use vim. I expect to be able to search when pressing / in terminal programs, just like I expect Ctrl+F to work in GUIs.
reply
fragmede
9 hours ago
[-]
There -R to quit if the file is less than the screen size. There's also most as an alternative pager, and also glow (of course which, my fork of it is better) to render md files in the terminal.
reply
lioeters
7 hours ago
[-]
Oh I see what you mean about glow, that looks like a nice UX improvement - I'm going to try your fork.

https://github.com/charmbracelet/glow/compare/master...fragm...

reply
pvtmert
7 hours ago
[-]
s/assorted/useful/
reply