Learn how to generate ASCII art text from the CLI using Figlet.

How to generate ASCII Art Text from the CLI using Figlet in Ubuntu 18.04

Does anyone remember those key generators that you used to activate those genuine programs for free? They always included the signature or name of the group with ASCII art like this:

.__.         __      .     .  .      .  .  .__       .      | 
|  |. .._.  /  ` _  _| _   |  | _ ._.| _|  [__) _  _.;_/ __ | 
|__|(_|[    \__.(_)(_](/,  |/\|(_)[  |(_]  |  \(_)(_.| \_)  * 

Normally you would imagine that they generated this manually, however, there are a lot of tools that allow you to generate automatically the ASCII art from plain text. In this article, I will explain to you how to easily install and use Figlet on your Ubuntu 18.04 server or desktop.

1. Install Figlet

FIGlet  prints  its  input  using  large  characters  (called ``FIGcharacters'') made up of ordinary screen  characters  (called  ``sub-characters''). FIGlet output  is  generally reminiscent of the sort of ``signatures'' many people like to put at the end of e-mail and UseNet messages. It is also reminiscent of the output of some banner programs,  although it is oriented normally, not sideways. The Figlet package is available directly from the APT repositories of Ubuntu. Run the following command in the terminal:

sudo apt-get install figlet

After the installation, the figlet tool will be available from the command line. The tool accepts the following options:

  • -f fontfile: Select the font.  The .flf suffix may be left off of fontfile, in which case FIGlet automatically appends it.  FIGlet looks for the file  first  in  the  default  font directory  and  then  in the current directory, or, if fontfile was given as a full pathname, in the given directory.  If the -f option is not specified,  FIGlet  uses the  font that was specified when it was compiled.  To find out which font this is, use the -I3 option.
  • -d fontdirectory: Change the default font directory.  FIGlet looks for fonts  first  in  the  default directory  and  then  in the current directory.  If the -d option is not specified, FIGlet uses the directory that was specified when it was  compiled.   To  find  out which directory this is, use the -I2 option.
  • -c, -l, -r, -x: These options  handle  the  justification of FIGlet output.  -c centers the output horizontally.  -l makes the  output  flush-left.   -r  makes  it  flush-right.   -x (default)  sets  the  justification according to whether left-to-right or right-to- left text is selected.  Left-to-right text will be flush-left, while  right-to-left text  will  be flush-right.  (Left-to-right versus right-to-left text is controlled by -L, -R and -X.)
  • -t, -w outputwidth: These options control the outputwidth, or the  screen  width  FIGlet  assumes  when formatting  its  output.   FIGlet  uses  the outputwidth to determine when to break lines and how to center the output.  Normally, FIGlet assumes 80  columns  so  that people with wide terminals won't annoy the people they e-mail FIGlet output to.  -t sets the outputwidth to the terminal  width.   If  the  terminal  width  cannot  be determined,  the  previous outputwidth is retained.  -w sets the outputwidth to the given integer.  An outputwidth of 1 is a special value that tells FIGlet  to  print each  non-space  FIGcharacter,  in  its entirety, on a separate line, no matter how wide it is.
  • -p, -n: These options control how FIGlet handles newlines.  -p puts FIGlet into ``paragraph mode'', which eliminates some unnecessary line breaks when piping a multi-line file through FIGlet.  In paragraph mode, FIGlet treats line breaks within a paragraph as if  they  were  merely  blanks  between  words.  (Specifically, -p causes FIGlet to convert any newline which is not preceded by a newline and not followed by a  space character  into  a blank.)  -n (default) puts FIGlet back to normal, in which every newline FIGlet reads causes it to produce a line break.
  • -D -E, -D switches to the German (ISO 646-DE) character set.  Turns `[', `\' and `]'  into umlauted A, O and U, respectively.  `{', `|' and `}' turn into the respective lower case versions of these.  `~' turns into s-z.  -E turns off  -D  processing.   These options  are  deprecated,  which  means  they  probably will not appear in the next version of FIGlet.
  • -C controlfile -N: These options deal with FIGlet controlfiles.  A controlfile is a file containing  a list  of  commands  that  FIGlet  executes  each  time it reads a character.  These commands can map certain input characters to other characters, similar to the  Unix tr command or the FIGlet -D option.  FIGlet maintains a list of controlfiles, which is empty when FIGlet starts up.  -C adds the given controlfile  to  the  list.   -N clears  the  controlfile  list,  cancelling  the effect of any previous -C.  FIGlet executes the commands in all controlfiles in the list.  See the  file  figfont.txt, provided with FIGlet, for details on how to write a controlfile.
  • -s -S -k -W -o: These  options  control  how  FIGlet  spaces the FIGcharacters that it outputs.  -s (default) and -S cause ``smushing''.  The  FIGcharacters  are  displayed  as  close together  as  possible,  and overlapping sub-characters are removed.  Exactly which sub-characters count as ``overlapping'' depends on the font's layoutmode, which  is defined  by  the font's author.  -k causes ``kerning''.  As many blanks as possible are removed between FIGcharacters, so that they touch, but  the  FIGcharacters  are not  smushed.  -W makes FIGlet display all FIGcharacters at their full width, which may be fixed or variable, depending on the font. The difference between -s and -S is that -s will not  smush  a  font  whose  author specified  kerning or full width as the default layoutmode, whereas -S will attempt to do so. If there is no information in the font about how to smush, or if the -o  option  is specified,  then  the  FIGcharacters  are  ``overlapped''.   This  means that after kerning, the first subcharacter of each FIGcharacter is removed.  (This is not done if a FIGcharacter contains only one subcharacter.)
  • -m layoutmode: Specifies  an  explicit  layoutmode  between 1 and 63.  Smushmodes are explained in figfont.txt, which also provides complete information on the  format  of  a  FIGlet font.   For  the sake of backward compatibility with versions of FIGlet before 2.2, -m0 is equivalent to -k, -m-1 is equivalent to -W, and -m-2 is  equivalent  to  -s. The  -m  switch  is  normally  used  only  by  font  designers  testing the various layoutmodes with a new font.
  • -v -I infocode: These options print various information about FIGlet, then  exit.   If  several  of these  options  are  given on the command line, only the last is executed, and only after all other command-line options have been dealt with. -v prints version and copyright information, as well as a ``Usage: ...''  line.  -I prints  the  information  corresponding  to  the  given  infocode  in a consistent, reliable (i.e., guaranteed to be the  same  in  future  releases)  format.   -I  is primarily  intended to be used by programs that use FIGlet.  infocode can be any of the following.
    • -1: Normal operation (default). This infocode indicates that FIGlet should operate normally, not giving  any informational printout, printing its input in the selected font.

    • 0: Version and copyright. This is identical to -v.

    • 1: Version (integer). This  will  print  the  version of your copy of FIGlet as a decimal integer. The main version number is multiplied by 10000, the  sub-version  number  is multiplied by 100, and the sub-sub-version number is multiplied by 1.  These are added together, and the result is printed out.  For example, FIGlet  2.2 will  print  ``20200''  ,  version  2.2.1  will print ``20201''.  Similarly, ascending,  with  later versions having higher numbers.  Note that the first major release of FIGlet, version 2.0, did not have the -I option.

    • 2: Default font directory. This will print the default font  directory.   It  is  affected  by  the  -d option.

    • 3: Font: . This  will  print  the name of the font FIGlet would use.  It is affected by the -f option.  This is not a filename; the ``.flf'' suffix is not printed.

    • 4: Output width. This will print the value FIGlet would use for outputwidth,  the  number  of columns  wide FIGlet assumes the screen is.  It is affected by the -w and -t options.

    • 5: Supported font formats. This will list font formats supported by  FIGlet  .   Possible  formats  are ``flf2''  for  FIGfont  Version  2  .flf  files and ``tlf2'' for TOIlet .tlf files. If infocode is any other positive value, FIGlet will simply exit  without  printing anything.

  • -L -R -X: These  options  control  whether  FIGlet prints left-to-right or right-to-left.  -L selects left-to-right printing.  -R selects right-to-left printing.   -X  (default) makes FIGlet use whichever is specified in the font file. Once  the  options  are read, if there are any remaining words on the command line, they are used instead of standard input as the source of text.  This feature allows shell  scripts  to generate large letters without having to dummy up standard input files. An empty argument, obtained by two sequential quotes, results in a line break.

2. Using Figlet

Figlet it's really easy to use, simply pass as positional argument the text that you want to convert to its ASCII art version and that's it:

figlet "Our Code World Rocks!"

3. Implementing Custom Fonts

You need to use custom figlet fonts (.flf) to print text in ASCII characters with custom styles. In this Github repository, you can find multiple fonts that you can use with Figlet. Simply download the repository with git in your server/computer:

git clone https://github.com/xero/figlet-fonts.git

Then run the figlet commands as usual, however, add the 2 extra parameters to specify the new directory of the fonts and the name of the font that you want to use:

  • -d: specify the path to the directory that contains the figlet fonts.
  • -f: specify the font name that you want to use (filename without extension).

The command goes like this:

figlet "text" -f <font-name> -d <path-to-fonts-directory>

In our case, we will print the "Our Code World Rocks!" with the 3D Diagonal.flf font downloaded from the mentioned repository:

figlet "Our Code World Rocks!" -f "3D Diagonal" -d ./figlet-fonts/

The command in the terminal would output the following text:

Figlet 3D Font Style

4. Printing Figlet content to a file

If instead of printing it to the terminal, you want to save the output into a file, simply pipe the output to the file that you want. For example, to save the content into a plain text file:

figlet "Our Code World Rocks!" -f "3D Diagonal" -d ./figlet-fonts/ > ./output-file.txt

Happy coding ❤️!

Senior Software Engineer at Software Medico. Interested in programming since he was 14 years old, Carlos is a self-taught programmer and founder and author of most of the articles at Our Code World.