280

I would like to display the contents of a text file on the command line. The file only contains 5-6 characters. Is there an easy way to do this?

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
Sam Weinberg
  • 2,913
  • 2
  • 13
  • 5

9 Answers9

370

Using cat

Since your file is short, you can use cat.

cat filename

Using less

If you have to view the contents of a longer file, you can use a pager such as less.

less filename

You can make less behave like cat when invoked on small files and behave normally otherwise by passing it the -F and -X flags.

less -FX filename

I have an alias for less -FX. You can make one yourself like so:

alias aliasname='less -FX'

If you add the alias to your shell configuration, you can use it forever.

Using od

If your file contains strange or unprintable characters, you can use od to examine the characters. For example,

$ cat file
(ÐZ4 ?o=÷jï
$ od -c test
0000000 202 233   ( 320   K   j 357 024   J 017   h   Z   4 240   ?   o
0000020   = 367  \n
0000023
  • 2
    +1, also `sed -n l file` could be useful. – enzotib Aug 11 '13 at 06:42
  • 1
    Does `less` have any clear advantages over other pager programs like [`pg`](https://en.wikipedia.org/wiki/Pg_%28Unix%29), or does it just boil down to personal preference? – Sam Weinberg Aug 11 '13 at 19:22
  • @SamWeinberg: `less` has more features than `pg`. Take a look at the [`less(1)`](http://linux.die.net/man/1/less) and [`pg(1)`](http://manpages.ubuntu.com/manpages/hardy/man1/pg.1.html) manpages. There are other pagers as well. Take a look at http://unix.stackexchange.com/questions/81129/what-are-the-differences-between-most-more-and-less/81131#81131. `less` is probably the most widely-used pager but which one you use comes down to personal preference. –  Aug 11 '13 at 19:33
  • don't forget `more` and `most`! –  Nov 02 '15 at 17:16
  • 1
    You can also use the `tail` command to see the last lines of text. – Jovylle Sep 30 '21 at 03:14
  • `cat` may be simple and easy, but using it like this will not pass Shellcheck. – b01 Jul 16 '22 at 22:16
  • `tail` is particularly useful for looking at large log files, since the most recent logs are usually at the bottom – Malcolm May 05 '23 at 16:57
59

Even though everybody uses cat filename to print a files text to the standard output first purpose is concatenating. From cat's man page:

cat - concatenate files and print on the standard output

Now cat is fine for printing files but there are alternatives:

  echo "$(<filename)"
or
  printf "%s" "$(<filename)"

The ( ) return the value of an expression, in this case the content of filename which then is expanded by $ for echo or printf.

Update:

< filename

This does exactly what you want and is easy to remember.

Here is an example that lets you select a file in a menu and then prints it.

#!/bin/bash

select fname in *;
do
# Don't forget the "" around the second part, else newlines won't be printed
  printf "%s" "$(<$fname)"
  break
done

For further reading:
BashPitfalls - cat file | sed s/foo/bar/ > file
Bash Reference - Redirecting

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
crunsher
  • 732
  • 5
  • 5
  • 2
    Your update: "`< filename` is exactly what you want, ..." is misleading. Overall, although this is an interesting discussion on alternatives, I think `cat` is simpler. – X Tian Sep 29 '15 at 20:21
  • 4
    Bare `< filename` does not display contents of the file, but `cat filename` does. – jarno Jun 21 '17 at 19:57
  • 3
    You could use `tee < filename`, too. – jarno Jun 21 '17 at 20:42
  • 6
    +1 for the `echo "$( – Yokai Jan 11 '18 at 08:13
  • 1
    That's great idea for using Linux Internal Command with echo `"$( – Saman Bayat Sep 25 '18 at 05:52
  • @jarno Why bare `< filename` does not display contents of the file? – pmor Aug 22 '22 at 11:36
  • I've tested, `< filename` only works on zsh and not on GNU bash version 5.1.16(1)-release. – t7e Sep 24 '22 at 19:21
  • Fun fact: use echo without double quote `echo $( – EsmaeelE Dec 11 '22 at 12:01
  • `cat`'s primarily use is to concatenate, but among all the commands that can dump the contents of a file, it's one of the rare ones that doesn't modify it in the process. Your `$(...)` removes trailing newline characters, in bash removes the NULs, `echo` does further modifications if there are backslashes or it starts with `-`. In bash, that still forks a process and the contents has to be fed through a pipe and stored whole several times in memory. Really not an improvement over `cat file`. – Stéphane Chazelas Jul 03 '23 at 06:26
  • @jarno, `< filename` works in zsh where it does `$READNULLCMD < filename`, `$READNULLCMD` being a pager by default. – Stéphane Chazelas Jul 03 '23 at 06:28
  • Be very careful with **filename** instead can destroy your file! – elmo Jul 03 '23 at 06:32
21

Tools for handling text files on unix are basic, everyday-commands:

In unix and linux to print out whole content in file

cat filename.txt

or

more filename.txt

or

less filename.txt

For last few lines

tail filename.txt

For first few lines

head filename.txt
Jari Keinänen
  • 215
  • 1
  • 2
  • 9
Abhishek
  • 311
  • 1
  • 4
10

You can use following command to display content of a text file.

cat filename 
forvaidya
  • 201
  • 1
  • 5
7

One option is to use more

e.g. more file.txt

However it does not have all the feature added by less.
One simple example is that you can't scroll back up in the output. Generally it has been superceeded by less - which was named in jest because

less is more

Michael Durrant
  • 41,213
  • 69
  • 165
  • 232
4

I always use $ less "your file here" , as it is very simple, provides a built in interactive grep command, and gives you an easy to use interface that you can scroll with the arrow keys.

(It is also included on nearly every *nix system)

SG60
  • 41
  • 2
  • `less` is the overkill-version of `more` (compare `man less` with `man more`), and for me it has two annoying features: 1) it switches to the alternate screen buffer, when less terminates, the file you were just viewing vanishes 2) at EOF you have to explicitly type `q` (I know, there's an option for this). So one of my first actions in a new environment is setting `export PAGER=/bin/more` in my profile and use `more` all the time. – ott-- Aug 11 '13 at 15:57
  • @ott--: 1) Try out the `-X` flag. 2) Try out the `-E` flag. `less` has a `more` emulation mode. You can enable it by setting the `LESS_IS_MORE` environmental variable. You can scroll upwards in the `more` emulation mode. –  Aug 11 '13 at 17:35
  • See also: http://unix.stackexchange.com/questions/81129/what-are-the-differences-between-most-more-and-less/81131#81131 –  Aug 11 '13 at 17:36
  • Though, in general, I do agree that `less` is overly-complicated. Its ability to run external commands is a perfect example of its over-complexity. –  Aug 11 '13 at 19:00
  • @EvanTeitelman I've always found the grep functionality extremely useful myself, @ott-- I find that because of it's emulation of `more`, and it's many additional features, it does the job very well. – SG60 Aug 14 '13 at 14:04
  • @ott-- I've never had problems with `less`'s alternate screen buffer, as it only does this when the file to show will not fit on the screen in its entirety. – SG60 Nov 07 '13 at 21:26
3

If its a large file, and you want to search some specific part, you can use

 cat filename | grep text_to_search -ni 

Also you can use more interactive Vim editor (or vi editor if you do not have Vim):

 vim filename
Or
 vi filename

Vim/vi is a great editor, can also be used as a reader in "Normal Mode" or using -R option, it has many features that will help you in browsing through the file.

0xF1
  • 649
  • 2
  • 8
  • 15
  • Shorter for `vim -R` is `view`. But keep in mind that it not likes redirections, as discussed in [xargs and vi - “Input is not from a terminal”](http://unix.stackexchange.com/questions/44426/xargs-and-vi-input-is-not-from-a-terminal). – manatwork Aug 12 '13 at 11:26
  • thanks @manatwork for the heads up! I have recently started using Vim and I like it because of its several features. Regarding redirections, I forgot about that, thanks for reminder. As of now, I am working on a remote VM, where I use ssh without GUI interface, therefore, Vim is of great use, when any other GUI editor cannot work, that's why I emphasized Vim here. – 0xF1 Aug 12 '13 at 11:48
1

Use cat command to display the content of filename.

cat filename  

Use vim command to edit file.

vim filename
Edward Shen
  • 868
  • 4
  • 8
0

Perl:

~$ perl -pe ''  Sonnet_18.txt

Raku:

~$ raku -pe ''  Sonnet_18.txt

Sample Output:

Shall I compare thee to a summer’s day?
Thou art more lovely and more temperate.
Rough winds do shake the darling buds of May,
And summer’s lease hath all too short a date.
Sometime too hot the eye of heaven shines,
And often is his gold complexion dimmed;
And every fair from fair sometime declines,
By chance or nature’s changing course untrimmed.
But thy eternal summer shall not fade
Nor lose possession of that fair thou ow’st,
Nor shall Death brag thou wand’rest in his shade,
When in eternal lines to time thou grow’st.
 So long as men can breathe or eyes can see,
 So long lives this, and this gives life to thee.

Clearly, cat is going to be the most popular answer to this question, but the code examples above will also provide the desired output (file courtesy of Shakespeare, via Project Gutenberg). However learning basic one-liners using Perl and/or Raku has its merits, simply because you can get an awful lot of work done with them.

Grep through a file, return matching lines:

~$ #Perl:
~$ perl -ne 'print if /eternal/'  Sonnet_18.txt
But thy eternal summer shall not fade
When in eternal lines to time thou grow’st.

~$ #Raku:
~$ raku -ne '.put  if /eternal/'  Sonnet_18.txt
But thy eternal summer shall not fade
When in eternal lines to time thou grow’st.

Substitute one bit of text with another, redirect output to a new file:

~$ #Perl:
~$ perl -pe 's/eternal/forevermore/g'   Sonnet_18.txt > new_sonnet.txt

~$ #Raku:
~$ raku -pe 's:g/eternal/forevermore/'  Sonnet_18.txt > new_sonnet.txt

https://perldoc.perl.org
https://docs.raku.org

jubilatious1
  • 2,385
  • 8
  • 16