Linux【2】-管理文件-4-文件内容查阅(cat/tac/nl/more/less/head/tail)

cat 由第一行开始显示档案内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示档案内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 以二进制的方式读取档案内容!

一、cat

cat 是 Concatenate (连续)的简写, 主要的功能是将一个档案的内容连续的印出在屏幕上面!

三个功能:

  1. 连接几个文件
  2. 从键盘创建文件
  3. 查看文件(不支持上翻,适用于小文件)

用法:

[root@www ~]# cat [-AbEnTv]

选项与参数:

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
-s  当遇到有连续 2 行以上的空白行时,就替换为 1 行的空白行。

注意,cat 命令用于查看文件内容时,不论文件内容有多少,都会一次性显示。如果文件非常大,那么文件开头的内容就看不到了。不过 Linux 可以使用PgUp+上箭头组合键向上翻页,但是这种翻页是有极限的,如果文件足够长,那么还是无法看全文件的内容。 因此,cat 命令适合查看不太大的文件。

范例一:检阅 /etc/issue 这个档案的内容

[root@www ~]# cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m

范例二:承上题,如果还要加印行号呢?

[root@www ~]# cat -n /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3
# 看到了吧!可以印出行号呢!这对于大档案要找某个特定的行时,有点用处!
# 如果不想要编排空白行的行号,可以使用『cat -b /etc/issue』,自己测试看看:

范例三:将 /etc/xinetd.conf 的内容完整的显示出来(包含特殊字符)

[root@www ~]# cat -A /etc/xinetd.conf
#$
....(中间省略)....
$
defaults$
{$
# The next two items are intended to be a quick access place to$
....(中间省略)....
^Ilog_type^I= SYSLOG daemon info $
^Ilog_on_failure^I= HOST$
^Ilog_on_success^I= PID HOST DURATION EXIT$

....(中间省略)....
includedir /etc/xinetd.d$

【例 2】将文件 file1.txt 和 file2.txt 的内容合并后输出到文件 file3.txt 中。

[root@localhost base]# ls
file1.txt    file2.txt
[root@localhost base]# cat file1.txt
http://c.biancheng.net(file1.txt)
[root@localhost base]# cat file2.txt
is great(file2.txt)
[root@localhost base]# cat file1.txt file2.txt > file3.txt
[root@localhost base]# more file3.txt
#more 命令可查看文件中的内容
http://c.biancheng.net(file1.txt)
is great(file2.txt)
[root@localhost base]# ls
file1.txt    file2.txt    file3.txt

报错:

/bin/cat: Argument list too long

解决办法:

find process/sort_5/ -type f  -name '*.tsv' -exec  cat {} + |sort |uniq |awk '{print $0 |"sort -r -n -k2,3"}' >process/sort_5/result.tsv;

二、Tac

[root@www ~]# tac /etc/issue

Kernel \r on an \m
CentOS release 5.3 (Final)
# 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!

tac 刚好是将 cat 反写过来,所以他的功能就跟cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『 由最后一行到第一行反向在屏幕上显示出来 』

三、nl

[root@www ~]# nl [-bnw] 档案
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加0 ;
-n rz :行号在自己字段的最右方显示,且加0 ;
-w :行号字段的占用的位数。

范例一:用 nl 列出 /etc/issue 的内容

[root@www ~]# nl /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m

# 注意看,这个档案其实有三行,第三行为空白(没有任何字符),
# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:

[root@www ~]# nl -b a /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3
# 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样


[root@www ~]# nl -b a -n rz /etc/issue
000001 CentOS release 5.3 (Final)
000002 Kernel \r on an \m
000003
# 嘿嘿!自动在自己字段的地方补上 0 了~预设字段是六位数,如果想要改成 3 位数?

[root@www ~]# nl -b a -n rz -w 3 /etc/issue
001 CentOS release 5.3 (Final)
002 Kernel \r on an \m
003
# 变成仅有 3 位数啰~

四、More (一页一页翻动)

在讲解 cat 命令时,我们留下了一个疑问,即当使用 cat 命令查看文件内容时,如果文件过大,以至使用PgUp+上箭头组合键向上翻页也无法看全文件中的内容,该怎么办呢?这就需要使用 more 命令。

more 命令可以分页显示文本文件的内容,使用者可以逐页阅读文件中内容,此命令的基本格式如下:

[root@localhost ~]# more [选项] 文件名

more 命令比较简单,一般不用什么选项,对于表 1 中所列的选项,读者只需看到认识即可。

表 1 more 命令选项及含义

选项 含义

-f  计算行数时,以实际的行数,而不是自动换行过后的行数。
-p  不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。
-c  跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。
-s  当遇到有连续两行以上的空白行时,就替换为一行的空白行。
-u  不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。
+n  从第 n 行开始显示文件内容,n 代表数字。
-n  一次显示的行数,n 代表数字。

more 命令的执行会打开一个交互界面,因此读者有必要了解一些交互命令,常用的交互命令如表 2 所示。

表 2 more 命令交互指令及功能

交互指令 功能
h 或 ? 显示 more 命令交互命令帮助。
q 或 Q 退出 more。
v 在当前行启动一个编辑器。
:f 显示当前文件的文件名和行号。
!<命令> 或 :!<命令> 在子Shell中执行指定命令。
回车键 向下移动一行。
空格键 向下移动一页。
Ctrl+l 刷新屏幕。
= 显示当前行的行号。
转到上一次搜索开始的地方。
Ctrf+f 向下滚动一页。
. 重复上次输入的命令。
/ 字符串 搜索指定的字符串。
d 向下移动半页。
b 向上移动一页。

【例 1】用分页的方式显示 anaconda-ks.cfg 文件的内容。

[root@localhost ~]# more anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
cdrom
…省略部分内容…
--More--(69%)

#在这里执行交互命令即可

【例 2】显示文件 anaconda-ks.cfg 的内容,每 10 行显示一屏,同时清楚屏幕,使用以下命令:

[root@localhost ~]# more -c -10 anaconda-ks.cfg
#省略输出内容。

五、less (一页一页翻动)

less 命令的作用和 more 十分类似,都用来浏览文本文件中的内容,不同之处在于,使用 more 命令浏览文件内容时,只能不断向后翻看,而使用 less 命令浏览,既可以向后翻看,也可以向前翻看。

不仅如此,为了方面用户浏览文本内容,less 命令还提供了以下几个功能:

  • 使用光标键可以在文本文件中前后(左后)滚屏;
  • 用行号或百分比作为书签浏览文件;
  • 提供更加友好的检索、高亮显示等操作;
  • 兼容常用的字处理程序(如 Vim、Emacs)的键盘操作;
  • 阅读到文件结束时,less 命令不会退出;
  • 屏幕底部的信息提示更容易控制使用,而且提供了更多的信息。

less 命令的基本格式如下:

[root@localhost ~]# less [选项] 文件名

此命令可用的选项以及各自的含义如表 1 所示。

表 1 less 命令选项及含义

选项 选项含义

-N  显示每行的行号。
-S  行过长时将超出部分舍弃。
-e  当文件显示结束后,自动离开。
-g  只标志最后搜索到的关键同。
-Q  不使用警告音。
-i  忽略搜索时的大小写。
-m  显示类似 more 命令的百分比。
-f  强迫打开特殊文件,比如外围设备代号、目录和二进制文件。
-s  显示连续空行为一行。
-b <缓冲区大小>  设置缓冲区的大小。
-o <文件名>    将 less 输出的内容保存到指定文件中。
-x <数字> 将【Tab】键显示为规定的数字空格。

在使用 less 命令查看文件内容的过程中,和 more 命令一样,也会进入交互界面,因此需要读者掌握一些常用的交互指令,如表 2 所示。

表 2 less 交互指令及功能

交互指令 功能

/字符串    向下搜索“字符串”的功能。
?字符串    向上搜索“字符串”的功能。
n   重复*前一个搜索(与 / 成 ? 有关)。
N   反向重复前一个搜索(与 / 或 ? 有关)。
b   向上移动一页。
d   向下移动半页。
h 或 H   显示帮助界面。
q 或 Q   退出 less 命令。
y   向上移动一行。
空格键 向下移动一页。
回车键 向下移动一行。
【PgDn】键 向下移动一页。
【PgUp】键 向上移动一页。
Ctrl+f  向下移动一页。
Ctrl+b  向上移动一页。
Ctrl+d  向下移动一页。
Ctrl+u  向上移动半页。
j   向下移动一行。
k   向上移动一行。
G   移动至最后一行。
g   移动到第一行。
ZZ  退出 less 命令。
v   使用配置的编辑器编辑当前文件。
[   移动到本文档的上一个节点。
]   移动到本文档的下一个节点。
p   移动到同级的上一个节点。
u   向上移动半页。

【例 1】使用 less 命令查看 /boot/grub/grub.cfg 文件中的内容。

[root@localhost ~]# less /boot/grub/grub.cfg
#
#DO NOT EDIT THIS FILE
#
#It is automatically generated by grub-mkconfig using templates from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
set default="0"
if [ "$ {prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry= save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
:

可以看到,less 在屏幕底部显示一个冒号(:),等待用户输入命令,比如说,用户想向下翻一页,可以按空格键;如果想向上翻一页,可以按 b 键。

六、head

head 命令可以显示指定文件前若干行的文件内容,其基本格式如下:

[root@localhost ~]# head [选项] 文件名

该命令常用选项以及各自的含义,如表 1 所示。

表 1 head 命令常用选项及含义

-n K    这里的 K 表示行数,该选项用来显示文件前 K 行的内容;如果使用 "-K" 作为参数,则表示除了文件最后 K 行外,显示剩余的全部内容。
-c K    这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容;如果使用 "-K",则表示除了文件最后 K 字节的内容,显示剩余全部内容。
-v  显示文件名;注意,如不设置显示的具体行数,则默认显示 10 行的文本数据。

【例 1】基本用法。

[root@localhost ~]# head anaconda-ks.cfg

head 命令默认显示文件的开头 10 行内容。如果想显示指定的行数,则只需使用 “-n” 选项即可,例如:

[root@localhost ~]# head -n 20 anaconda-ks.cfg

这是显示文件的开头 20 行内容,也可以直接写 “-行数”,例如:

[root@localhost ~]# head -20 anaconda-ks.cfg


[root@linux ~]# head /etc/man.config
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@linux ~]# head -n 20 /etc/man.config

 如果后面100行数据都不打印,只打印/etc/man.config前面几行,该如何是好呢
[root@linux ~]# head -n -100 /etc/man.config

若没有加上 -n 这个参数时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可! 另外-n这个参数后面可以接一个负数,例如上面的,表示列出前面所有的行数,但不包括后面的的100行。如果这个文件有141行的话,就只列出前面的41行,后面的100行就丢掉。

七、tail (取出后面几行)

tail 命令和 head 命令正好相反,它用来查看文件末尾的数据,其基本格式如下:

[root@localhost ~]# tail [选项] 文件名

此命令常用的选项及含义如表 1 所示。

表 1 tail 命令选项及含义

选项 含义

-n K    这里的 K 指的是行数,该选项表示输出最后 K 行,在此基础上,如果使用 -n +K,则表示从文件的第 K 行开始输出。
-c K    这里的 K 指的是字节数,该选项表示输出文件最后 K 个字节的内容,在此基础上,使用 -c +K 则表示从文件第 K 个字节开始输出。
-f  输出文件变化后新增加的数据。

【例 1】查看 /etc/passwd 文件最后 3 行的数据内容。

[root@localhost ~]# tail -n 3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

除此之外,还可以采用如下这种形式:

[root@localhost ~]# tail -3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

可以看到,使用 tail -n 3 /etc/passwd 命令和 tail -3 /etc/passwd 的效果是一样的。

【例 2】查看 /etc/passwd 文件末尾 100 个字节的数据内容。

[root@localhost ~]# tail -c 100 /etc/passwd
cpdump:x:72:72::/:/sbin/nologin

【例 3】 监听文件的新増内容。tail 命令有一种比较有趣的用法,可以使用 “-f” 选项来监听文件的新増内容,例如:

[root@localhost ~]#tail -f anaconda-ks.cfg
@server-platform
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end
#光标不会退出文件,而会一直监听在文件的结尾处

这条命令会显示文件的最后 10 行内容,而且光标不会退出命令,每隔一秒会检查一下文件是否增加新的内容,如果增加就追加到原来的输出结果后面并显示。因此,这时如果向文件中追加一些数据(需要开启一个新终端):

[root@localhost ~]# echo 2222222222 >> anaconda-ks.cfg
[root@localhost ~]# echo 3333333333 >> anaconda-ks.cfg
#在新终端中通过echo命令向文件中追加数据

那么,在原始的正在监听的终端中,会看到如下信息:

[root@localhost ~]# tail -f anaconda-ks.cfg @server-platforin
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end2222222222
33333333333
#在文件的结尾处监听到了新増数据

如果想终止输出,按【Ctrl+c】键中断 tail 命令即可。

【例 4】 假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢? 答: 这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:

head –n 20 ~/.bashrc | tail –n 10 ,
这样就可以得到第 11 到第 20 行之间的内容了! 但是里面涉及到管线命令,需要在第三篇的时候才讲的到!

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学