How do I write all lines from less to a file?

I’ve piped a command to less, and now I want to save the command’s output to a file. How do I do that?

In this case, I don’t want to use tee, I want a solution directly from less, so that I don’t have to rerun a long-running command if I forgot to use tee.

This question is similar to this one, the only difference is that I want to save all of the lines, not a subset: Write lines to a file from less

Asked By: Flimm


You don’t use less, you use tee and then pipe tee to less.

./program | tee program.out | less

Answered By: SailorCire

One way to do it without tee is as follows.
less /path/to/input > /path/to/output
The above will overwrite /path/to/output if it already exists.

To do the same, but append to /path/to/output is as follows.
less /path/to/input >> /path/to/output

To save the text in less after you have opened it, you can use the Save File feature.
When in less, press s. Then, type the file name.
If you used a pipe, the file will automatically be written to Working Directory.
If you did not use a pipe, you will open a file with the text (for which you can save).
I believe the file will be opened in vim.

Answered By: nehcsivart

From less, type s then type the file name you want to save to, then Enter.
From the man page, under COMMANDS:

s filename
      Save the input to a file.  This only works if the input is a pipe, not an ordinary file.

man page also states that, depending on your particular installation, the s command might not be available. In that case, you could go to line 1 with:

g or < or ESC-<
      Go to line N in the file, default 1 (beginning of file).

and pipe the whole content to cat with:

| <m> shell-command
      <m> represents any mark letter. Pipes a section of the input file to the
      given shell command. The section of the file to be piped is between the
      first line on the current screen and the position marked by the letter. 
      <m> may also be ^ or $ to indicate beginning or end of file respectively.

so either:

g|$cat > filename


<|$cat > filename

i.e. type g or < (g or less-than) | $ (pipe then dollar) then cat > filename and Enter.
This should work whether input is a pipe or an ordinary file.

Answered By: don_crissti
Categories: Answers Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.