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?
9 Answers
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
-
1Does
less
have any clear advantages over other pager programs likepg
, or does it just boil down to personal preference? Commented Aug 11, 2013 at 19:22 -
@SamWeinberg:
less
has more features thanpg
. Take a look at theless(1)
andpg(1)
manpages. There are other pagers as well. Take a look at unix.stackexchange.com/questions/81129/….less
is probably the most widely-used pager but which one you use comes down to personal preference.– user26112Commented Aug 11, 2013 at 19:33 -
don't forget
more
andmost
!– user79560Commented Nov 2, 2015 at 17:16 -
1You can also use the
tail
command to see the last lines of text.– JovylleCommented Sep 30, 2021 at 3:14
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 (for zsh
):
< filename
This does exactly what you want, is easy to remember, but doesn't work in bash
.
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
-
2Your update: "
< filename
is exactly what you want, ..." is misleading. Overall, although this is an interesting discussion on alternatives, I thinkcat
is simpler.– X TianCommented Sep 29, 2015 at 20:21 -
4Bare
< filename
does not display contents of the file, butcat filename
does.– jarnoCommented Jun 21, 2017 at 19:57 -
3
-
6+1 for the
echo "$(<filename)"
bashism. Not enough of that here.– YokaiCommented Jan 11, 2018 at 8:13 -
2I've tested,
< filename
only works on zsh and not on GNU bash version 5.1.16(1)-release.– t7eCommented Sep 24, 2022 at 19: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
You can use following command to display content of a text file.
cat filename
-
For more information about
cat
, runman cat
.– user26112Commented Aug 11, 2013 at 3:58
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
-
1
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)
-
less
is the overkill-version ofmore
(compareman less
withman 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 typeq
(I know, there's an option for this). So one of my first actions in a new environment is settingexport PAGER=/bin/more
in my profile and usemore
all the time.– ott--Commented Aug 11, 2013 at 15:57 -
@ott--: 1) Try out the
-X
flag. 2) Try out the-E
flag.less
has amore
emulation mode. You can enable it by setting theLESS_IS_MORE
environmental variable. You can scroll upwards in themore
emulation mode.– user26112Commented Aug 11, 2013 at 17:35 -
-
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.– user26112Commented Aug 11, 2013 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.– SG60Commented Aug 14, 2013 at 14:04
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.
-
Shorter for
vim -R
isview
. But keep in mind that it not likes redirections, as discussed in xargs and vi - “Input is not from a terminal”. Commented Aug 12, 2013 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.– 0xF1Commented Aug 12, 2013 at 11:48
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
Use cat
command to display the content of filename.
cat filename
Use vim
command to edit file.
vim filename
type filename
command