98

Given a text file, or the output of a command, how can I truncate it so that every line longer than N characters (usually N=80 in a terminal) gets shorten to N characters maximum?

Totor
  • 20,040

1 Answers1

145

You can use cut to achieve this (using N=80 here):

some-command | cut -c -80

or

cut -c -80 some-file.txt

Replace 80 with the number of characters you want to keep.

Note that:

  • Multi-bytes characters may not be handled correctly, depending on your implementation;
  • Multi-characters bytes (aka tabs) may be treated as one char (& this question treats this).

Dale Anderson suggests the use of some-command | cut -c -$COLUMNS which truncates to the current terminal width.

Libin Wen suggests that the equivalent cut -c 1-80 may be better for understanding.

Totor
  • 20,040
  • 24
    The equivalent form cut -c 1-80 may be better for understanding. – Libin Wen Oct 28 '19 at 10:57
  • 2
    fixed command syntax you must supply a range: "some-command | cut -c 1-80" – Bernard Hauzeur Jan 27 '20 at 09:43
  • 5
    Without the 1 it's easy to miss the - before the 80 so I agree it makes more sense. – Sridhar Sarnobat Feb 05 '20 at 01:05
  • 8
    I like to use some-command | cut -c -$COLUMNS which uses the entire terminal width, whatever that currently happens to be. – Dale C. Anderson Jan 18 '21 at 06:52
  • How to keep color from some-command? – Kindred Apr 22 '22 at 06:56
  • @Kindred usually, some-command detect their output type (terminal, pipe, file...), and thus automatically disable colouring when their output is not going to a terminal. There is usually an option to force coloured output. For example, grep --color=always (same for ls). Look at the man for your-command. Note that your version of cut however, may not consider the extra colouring bytes as zero sized characters, and may therefore cut a text with and without colour differently. – Totor May 28 '22 at 12:42
  • 1
    Using ... cut -c -${SOME_NUMBER} ... may result in invalid strings, as for example with emojis (which are multibyte characters). Example: Using `` (with each of these emoji smiley being a 4-byte character): echo '' | cut -b -7 | xargs touch creates a file named ''$'\360\237\230', that is: the first four bytes are correctly interpreted as the Smiling Face with Sunglasses, while the remaining three bytes result in an invalid UTF-8 byte sequence. – Abdull Aug 25 '23 at 21:44
  • Exacerbatingly, even in 2023, GNU coreutils 9.3's cut still doesn't handle UTF-8 right, as it assumes a "character" to always be "one byte" in size (see https://unix.stackexchange.com/a/163725/20230), so cut -c behaves effectively like cut -b ("b" for "byte"). To get rid of any invalid trailing bytes, the string can be piped through iconv -c -t UTF-8: echo '' | cut -b -7 | iconv -c -t UTF-8 | xargs touch creates a file named , while `echo '' | cut -b -8 | iconv -c -t UTF-8 | xargs touch` (one more byte) results in a file. – Abdull Aug 25 '23 at 21:45