如果我们要查看一个文件的内容时,该如何是好?
这里有相当多有趣的命令可以来分享一下:最常使用的显示文件内容的命令可以说是cat与more及less了。
此外,如果我们要查看一个很大的文件(好几百MB时),但是我们只需要后面的几行字而已,那么该如何是好?
呵呵,用tail呀。此外,tac这个命令也可以达到这个目的。好了,说说各个命令的用途。
- cat :由第一行开始显示文件内容。
- tac:从最后一行开始显示,可以看出tac是cat的倒着写、
- nl:显示的时候,同时输出行号。
- more:一页一页地显示文件内容。
- less:与more类似,但是比more更好的是,它可以往前翻页。
- head:只看前面几行。
- tail :只看后面几行。
- od :以二进制的方式读取文件内容。
1.直接查看文件内容
直接查看一个文件的内容可以使用cat/tac/nl这几个命令。
1.1.cat ( concatenate)
选项与参数:
- -A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已;
- -b:列出行号,仅针对非空白行做行号显示,空白行不标行号;
- -E:将结尾的换行符S显示出来;
- -n:打印出行号,连同空白行也会有行号,与-b的选项不同;
- -T:将[tab]按键以^I(大写的i)显示出来;
- -v :列出一些看不出来的特殊字符;
范例一:查看/etc/issue 这个文件的内容
范例二:承上题,如果还要打印行号?所以这个文件有三行,看到了吧!可以列出行号。这对于大文件要找某个特定的行时,有点用处.
#如果不想要显示空白行的行号,可以使用【cat -b /etc/issue 】,自己测试看看。
范例三:将/etc/man db.conf的内容完整的显示出来(包含特殊字符)。
……(下面省略)…….上面的结果限于篇幅,我删除掉了很多数据。另外,输出的结果并不会有特殊字体,
上面的特殊字体是要让您发现差异点在哪里,
基本上,在一般的环境中,使用[tab]与空格键的效果差不多,都是一堆空白。我们无法知道两者的差别。 此时使用cat -A就能够发现那些空白的地方是啥鬼东西了。
[tab]会以^I表示,换行符则是以表示$表示,
所以你可以发现每一行后面都是$,不过换行符在Windows/Linux则不太相同,Windows的换行符是^M$.
嘿嘿,Linux里面有“猫”命令?不是的,cat是Concatenate(串联)的简写,主要的功能是将一个文件的内容连续打印在屏幕上面。例如上面的例子中,我们将/etc/issue打印出来,如果加上-n或-b的话,则每一行前面还会加上行号。
个人比较少用cat。毕竟当你的文件内容的行数超过40行以上,根本来不及在屏幕上看到结果。所以,配合等一下要介绍的more或是 less来执行比较好。
此外,如果是一般的DOS文件时,就需要特别留意一些奇怪的符号了,例如换行与[Tab]等要显示出来,就得加入-A之类的选项。
1.2.tac(反向列示)
与刚刚上面的范例一比较,是由最后一行先显示。
tac 这个好玩了。怎么说?详细看一下,cat与tac,有没有发现?
对,tac 刚好是将cat反写动来,所以它的功能就跟cat相反,cat 是由第一行到最后一行连续显示在屏幕上,而tac则是由最尽一行到第一行反向在屏幕上显示出来,很好玩吧!
1.3.nl(添加行号打印)
选项与参数
-b:指定行号指定的方式,主要有两种
- -b a:表示不论是否为空行,也同样列出行号(类似cat -n);
- -b t:如果有空行,空的那一行不要列出行号(默认值);
-n:列出行号表示的方法,主要有三种:
- -n 1n:行号在屏幕的最左方显示;
- -n rn:行号在自己栏位的最右方显示,且不加0;
- -n rz:行号在自己栏位的最右方显示,且加0;行号栏位的占用的字符数。
-w:行号栏位占用的字符数
范例一:用nl列出/etc/issue的内容.
注意看,这个文件其实有三行,第三行为空白(没有任何字符),
因为它是空白行,所以nl不会加上行号,如果确定要加上行号,可以这样做。
#呵呵,行号加上来,那么如果要让行号前面自动补上0?可以这样。
嘿嘿,自动在自己栏位的地方补上0了,默认栏位是六位数,如果想要改成3位数?
nl 可以将输出的文件内容自动地加上行号,其默认的结果与cat-n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等的功能。
有的复杂啊!!!不过别担心,这个基本不用的
2.可翻页查看
nl与cat、tac等,都是一次性地将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的命令?
让我们可以一页一页的观察,才不会前面的数据看不到。有,那就是more与less。
2.1.more(一页一页翻动)
这样子 文件里的内容就一页一页的展示给我们了
重点在最后一行,你的光标也会在这里等待你的命令
仔细地给它看到上面的范例,如果more后面接的文件内容行数大于屏幕输出的行数时,就会出现类似上面的图例。重点在最后一行,最后一行会显示出目前显示的百分比,而且还可以在最后一行输入一些有用的命令。
在more 这个程序的运行过程中,你有几个按键可以使用:
- 空格键(space):代表向下翻一页;
- Enter:代表向下翻一行;
- /字符串:代表在这个显示的内容当中,向下查找字符串这个关键词;
- :f:立刻显示出文件名以及目前显示的行数;
- q:代表立刻离开more,不再显示该文件内容;
- b或[ctrl]-b:代表往回翻页,不过这操作只对文件有用,对管道无用。
要离开more 这个命令的显示工作,可以按下q就能够离开。而要向下翻页,使用空格键即可。
比较有用的是查找字符串的功能,
举例来说,我们使用more /etc/man_db.conf来观察该文件,若想要在该文件内查找MANPATH这个字符串时,可以在底行处输入/MANPATH
输入了/之后,光标就会自动跑到最下面一行等待输入
如同上面的说明,输入了/之后,光标就会跑到最下面一行,并且等待你的输入,你输入了字符串并按下[enter]之后,more就会开始向下查找该字符串,而重复查找同一个字符串,可以直接按下n即可。最后,不想要看了,就按下q即可离开more。
more的缺点就是只能往后翻!!!!!
2.2.less(一页一页翻动)
我们先看例子
和more好像差不多?
less的用法比起more又更加有弹性,在more的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less 时,就可以使用【pageup]、[pagedown]等按键的功能来往前往后翻看文件,你看是不是更容易观看一个文件的内容了。
除此之外,在less 里面可以拥有更多的查找功能。不止可以向下查找,也可以向上查找,实在是很不错,基本上,可以输入的命令有:
- 空格键:向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup]:向上翻动一页;
- /字符串:向下查找字符串的功能;
- ?字符串:向上查找字符串的功能;
- n:重复前一个查找(与/或?有关);
- N:反向的重复前一个查找(与/或?有关);
- g:前进到这个数据的第一行;
- G:前进到这个数据的最后一行去(注意大小写);
- q:离开less这个程序。
查看文件内容还可以进行查找的操作,看,less是否很不错?其实less还有很多的功能,详细的你是否会觉得 less 使用的画面与环境与man page非常类似?
没错,因为man这个命令就是询用less来显示说明文件的内容,现在你是否觉得less很重要?
使用方式请使用man less查询一下。
3.数据截取
我们可以将输出的数据作一个最简单的截取,那就是取出文件前面几行(head)或取出后面几行(tail)文字的功能。
不过,要注意的是head与tail都是以“行”为单位来进行数据截取的。
3.1.head(取出前面几行)
- head [-n number]文件
选项与参数:
- -n:后面接数字,代表显示几行的意思。
默认的情况中,显示前面十行,若要显示前 20行,就得要这样。
范例:如果后面 100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好?
head的英文意思就是“头”,那么这个东西的用法自然就是显示出一个文件的前几行,没错,就是这样。
若没有加上-n这个选项时,默认只显示十行,若只要一行?那就加入“head-n 1 filename”即可。
另外那个-n选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列出前面所有行数,但不包括后面 100行。举例来说CentOS 7.1的 /etc/man_db.conf 共有131行,则上述的命令“head-n-100 /etc/man_db.conf”就会列出前面31行,后面100行不会打印出来了。这样说,比较容易懂了吧?
3.1.tail(取出后面几行)
选项与参数:
- -n:后面接数字,代表显示几行的意思。
- -f:表示持续刷新显示后面所接文件中的内容,要等到按下[ctrl]-c才会结束
默认的情况中,显示最后的十行。若要显示最后的20行,就得要这样:
范例一:如果不知道/etc/man db,conf有几行,却只想列出100行以后的数据时?
范例二:持续检测/var/log/messages的内容
要等到输入[crtl]-c之后才会结束执行tail这个命令.
有head自然就有tail(尾巴),没错,这个tail的用法跟head的用法类似,只是显示的是后面
几行。默认也是显示十行,若要显示非十行,就加-n number的选项即可。
范例一的内容就有趣啦,其实与head-n-xx有异曲同工之妙。当执行 tail -n +100 /etc/man db.conf 代表该文件从100行以后都会被列出来,同样,在man_db.conf共有131行,因此第100-131行就会被列出来,前面的99行都不会被显示出来。
至于范例二中,由于/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到屏幕上,就利用-f这个选项,它可以一直刷新显示/var/log/messages这个文件,新加入的数据都会被显示到屏幕上,直到你按下[crtl]-c才会结束 tail 这个命令的执行,由于messages必须要 root权限才能看,所以该范例得要使用root来查询。
例题
假如我想要显示/etc/man_db.conf的第11到第20行?
答:这个应该不算难,想一想,在第11到第20行,那么我取前20行,再取后十行,所以结果就是:【head -n 20 /etc/man_db.conf | tail -n 10】,这样就可以得到第11到第20行之间的内容了。
这两个命令中间有个管道(|)的符号存在,这个管道的意思是:前面的命令所输出的信息,通过管道交由后续的命令继续使用。所以,head-n20/etc/man_db.conf会将文件内的20行取出来,但不输出到屏幕上,而是转交给后续的tai 命令继续处理。因此 tal不需要接文件名,因为tai 所需要的数据是来自于head处理后的结果
例题
承上一题,那如果我想要列出正确的行号?就是屏幕上仅列出letc/man_db.conf的第11到第20行,且有行号存在?答:我们可以通过 cat-n来显示出行号,然后再通过head/tail 来截取数据即可,所以就变成了如下的模样:【cat -n /etc/man db.conf | head -n 20 | tail -n 10】
有没有头晕呢?
4.非纯文本文件:od
我们上面提到的都是在查看纯文本文件的内容。那么万一我们想要查看非文本文件呢??
举例来说,例如/usr/bin/passwd这个执行文件的内容时,又该如何去读出信息呢?
事实上,由于执行文件通常是二进制文件(binary file),使用上面提到的命令来读取它的内容时,确实会产生类似乱码的数据。那怎么办?
没关系,我们可以利用od 这个命令来读取。
- od[-t TYPE]文件
选项或参数:
-t:后面可以接各种【类型(TYPE)】的输出,例如:
- a :利用默认的字符来输出;
- c :使用ASCII字符来输出;
- d[size]:利用十进制(decimal)来输出数据,每个整数占用size Bytes;
- f[sizel:利用浮点数值(floating)来输出数据,每个数占用size Bytes;
- o[size]:利用八进制(octa1)来输出数据,每个整数占用 size Bytes;
- x[size]:利用十六进制(hexadecimal)来输出数据,每个整数占用size Bytes;
范例一:请将/usr/bin/passwd的内容使用ASCII方式来显示。……(后面省略)……
最左边第一列是以八进制来表示Bytes数.
以上面范例来说,第二栏0000020代表开头是第16个byte(2x8)的内容之意。
范例二:请将/etc/issue这个文件的内容以八进制列出存储值与ASCII的对照表。
如上所示,可以发现每个字符可以对应到的数值是什么。要注意的是,该数值是八进制.例如S对应的记录数值为123,转成十进制:1x8^2+2x8+3=83.
利用这个命令,可以将数据文件(data file)或是二进制文件(binary file)的内容数据读出来虽然读出来的数值默认是使用非文本文件,亦即是十六进制的数值来显示,不过,我们还是可以通过-t c的选项与参数来将数据内的字符以ASCII类型的字符来显示,虽然对于一般用户来说,这个命令的用处可能不大,但是对于工程师来说,这个命令可以将二进制文件(binary file)的内容作一个大致的输出,他们可以看得出其中的意义。
如果对纯文本文件使用这个命令,你甚至可以发现ASCII与字符的对照表,非常有趣,例如上述的范例二,你可以发现到每个英文字S对照到的数字都是123,转成十进制你就能够发现那是83。
如果你有任何程序语言的书,拿出来对照一下ASCII的对照表,就能够发现真是正确。
我不想查Google,想要立刻找到password 这几个字的ASCI对照,该如何通过od来判断?
答:其实可以通过刚刚上一个小节谈到的管道命令来处理。如下所示:
【echo password | od -t oCc】
echo可以在屏幕上面显示任何信息,而这个信息不由屏幕输出,而是传给od去继续处理,就可以得到ASCIl code对照。