第4章 文件内容查看

查看文件内容的常见命令
- cat
- more 和 less
- head 和 tail
- nl
- tailf
cat命令
语法:
用法:cat [选项]... [文件]...
常用选项:
-n, 对输出的所有行编号
-b, 对输出的所有行编号(不含空白行)
-t, 将制表符(tab)显示为^I
-e, 在每行结束处显示"$"
-s, 当连续空白行数量大于1时,合并为1个空白行
cat命令会一次性将文件的完整内容全部显示出来,不适合大文件。
查看文件所有内容
cat HelloWorld.java
查看文件所有内容,并且添加行号
cat -n HelloWorld.java
查看文件所有内容,添加行号,但空白行不加行号
cat -b HelloWorld.java
查看文件所有内容,将制表符显示为^I
cat -t HelloWorld.java
查看文件所有内容,在每行结束处显示"$"
cat -e HelloWorld.java
查看文件所有内容,合并多个连续的空白行为1个空白行
cat -s HelloWorld.java
一次查看多个文件
cat a.txt b.txt
使用cat合并文件
cat a.txt b.txt > c.txt
加上行号之后输出到另一个文件
cat -n HelloWorld.java > HelloWorld2.java
清空文件内容
cat /dev/null > HelloWorld.java
more命令
more命令和cat命令的相同点和不同点:
- 相同点:more和cat在开始读取文件的时候,都是一次性的将文件全部内容装载到缓存中。
- 不同点:cat是一次性的全部输出打印。more可以进行部分打印(一屏一屏的打印)。
用法:
more [选项] <文件>...
常用选项:
-<number> 每个屏幕的行数
+<number> 从行号开始显示文件
+/<pattern> 从匹配的位置前两行开始显示内容
-p 以清除原内容的方式进行翻页。
常用操作:
回车键 【显示下一行】
空格键 【显示下一页】
ctrl + b 【显示上一页】
= 【显示行号】
:f 【显示文件名的同时显示行号】
q 【退出more命令】
这里有日志文件:log.txt,内容如下:
2021.10.1 zhangsan
2021.10.2 lisi
2021.10.3 wangwu
2021.10.4 zhaoliu
2021.10.5 admin
2021.10.6 zhangsan
2021.10.7 lisi
2021.10.8 wangwu
2021.10.9 zhaoliu
2021.10.10 qianqi
2021.10.11 zhouyu
2021.10.12 huanggai
2021.10.13 zhugeliang
2021.10.14 simayi
2021.10.15 maimaiti
2021.10.16 erdaye
2021.10.17 sandaye
2021.10.18 zhangsan
2021.10.19 lisi
2021.10.20 wangwu
2021.10.21 zhaoliu
2021.10.22 qianqi
2021.10.23 zhoubapi
2021.10.24 doudizhu
2021.10.25 nongmin
2021.10.26 sunwukong
2021.10.27 zhubajie
2021.10.28 shaseng
2021.10.29 wujing
2021.10.30 baigujing
2021.10.31 java
2021.11.1 oracle
2021.11.2 mysql
2021.11.3 jdbc
2021.11.4 servlet
2021.11.5 jsp
2021.11.6 spring
2021.11.7 mybatis
2021.11.8 springmvc
2021.11.9 web
2021.11.10 html
2021.11.11 css
2021.11.12 java
2021.11.13 sun
案例1:从第3行起,查看文件内容。
more +3 log.txt
案例2:每屏显示4条记录。
more -4 log.txt
案例3:从文件中查找"java"字符串的行
more +/java log.txt
案例4:查看进程,每5条为一屏,翻屏时清空原内容
ps -ef | more -5 -p
less命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。使用less 时,可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 中可以拥有更多的搜索功能。
less命令用法
有这样的一个文件:usernames.txt
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
ZHANGSAN
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
ZHANGSAN
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
zhangsan
lisi
wangwu
zhaoliu
sunwukong
zhubajie
wusong
linchong
huanggai
songjiang
用法:less [选项] 文件
常用选项:
-g 只标志当前搜索到的关键词所在行
-I 忽略搜索时的大小写(注意:是大写I)
-m 显示类似more命令的百分比
-N 显示每行的行号
+num 从第num行开始显示
常用操作:
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
y 向前滚动一行
回车键 向后滚动一行
u 向前滚动半页
d 向后滚动半页
b 向前翻一页
空格键 向后翻一页
g 移动到第一行
G 移动到最后一行
= 显示详细信息(第几行,共多少行,内容的字节数量等)
v 使用vim编辑器进行编辑
q 退出less 命令
[pagedown] 向下翻动一页
[pageup] 向上翻动一页
less命令标记兴趣点
在感兴趣的位置添加标记:
- 先按m键 (set mark)
- 输入标记名称,例如标记名字为:x
需要回到感兴趣的位置时:
- 先按 ' 键 (goto mark)
- 输入标记名称 x
less命令实时监控文件动态变化
第一步:在窗口1中执行:less +F log.txt
第二步:在窗口2中执行:ps -ef >> log.txt
注意:在监控的过程中,按 ctrl + c是终止监控,可以继续使用less命令的相关操作。按大写F,再次进入监控模式。
注意:log.txt是一个文件名。只有机器自动写入或通过输出重定向写入的才可以被监控。
less命令查看多个文件
less log.txt log2.txt
- 输入:n 跳转到log2.txt
- 输入:p 跳转到log.txt
less命令结合管道一起使用
ps -ef | less -N
head命令
head命令:显示文件头部内容。
用法:head [选项]... [文件]...
将每个指定文件的前 10 行输出到标准输出。
如果指定了多于一个文件,在每块输出之前附加文件名称作为头部。
参数:
-c 输出前几个字符
-n 指定行数
-q 不显示包含给定文件名的文件头
前三行:
前9个字符:
显示多个文件的前3行:
不带文件名标识:
tail命令
tail命令:显示文件尾部内容。
用法:tail [选项]... [文件]...
显示每个指定文件的最后 10 行并输出至标准输出。
若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头。
参数:
-c 输出最后几个字符
-f 随文件增长即时输出新增数据
-n 指定行数
-q 不输出文件名的头
默认显示文件末尾的后10行:
指定行数:
一次查看多个文件:
不显示文件名:
监控文件变化:
在窗口1中:
在窗口2中:
可以看到窗口1发生了变化:
nl命令
nl命令是比较专业的显示行号的命令。
用法如下:
- nl -b a 所有行添加行号,包括空白行;
- nl -b t 给行添加行号,不包括空白行(默认行为,和直接使用 nl 一样效果);
- nl -n ln 行号在自己栏位左侧显示;
- nl -n rn 行号在自己栏位的右侧显示 ;
- nl -n rz 显示行号,行号栏位不满时,自动补0 ;
- nl -w 行号栏位的占用的位数。
文件内容如下:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}
class UserService{
public void logout(){
System.out.println("system log out!");
}
}
执行以下命令:
nl HelloWorld.java
执行结果:
执行以下命令:显示所有行的行号,包括空白行。
nl -b a HelloWorld.java
执行结果:
执行以下命令:显示行号,不包括空白行。(这是一种默认的方式,和“nl HelloWorld.java”效果一样)
nl -b t HelloWorld.java
执行以下命令:行号在行号栏位左侧显示
nl -n ln HelloWorld.java
执行结果:
执行以下命令:行号在行号栏位右侧显示
nl -n rn HelloWorld.java
执行结果:
执行以下命令:行号栏位自动补0
nl -n rz HelloWorld.java
执行结果:
执行以下命令:设置栏位的字符数量
nl -n rz -w 3 HelloWorld.java
执行结果:
tailf命令
与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件。tailf特别适合那些便携机上跟踪日志文件,因为它能省电,因为减少了磁盘访问。tailf命令不是个脚本,而是一个用C代码编译后的二进制执行文件,某些Linux安装之后没有这个命令。
CentOS系统是不支持该命令的,可以按照以下步骤添加这个命令:
第一步:cd命令切换到/usr/local目录下,新建tailf.c文件,该文件内容如下:
/* tailf.c -- tail a log file and then follow it
* Created: Tue Jan 9 15:49:21 1996 by faith@acm.org
* Copyright 1996, 2003 Rickard E. Faith (faith@acm.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* less -F and tail -f cause a disk access every five seconds. This
* program avoids this problem by waiting for the file size to change.
* Hence, the file is not accessed, and the access time does not need to be
* flushed back to disk. This is sort of a "stealth" tail.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/stat.h>
//#include "nls.h"
#define _(s) s
static size_t filesize(const char *filename)
{
struct stat sb;
if (!stat(filename, &sb)) return sb.st_size;
return 0;
}
static void tailf(const char *filename, int lines)
{
char **buffer;
int head = 0;
int tail = 0;
FILE *str;
int i;
if (!(str = fopen(filename, "r"))) {
fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
perror("");
exit(1);
}
buffer = malloc(lines * sizeof(*buffer));
for (i = 0; i < lines; i++) buffer[i] = malloc(BUFSIZ + 1);
while (fgets(buffer[tail], BUFSIZ, str)) {
if (++tail >= lines) {
tail = 0;
head = 1;
}
}
if (head) {
for (i = tail; i < lines; i++) fputs(buffer[i], stdout);
for (i = 0; i < tail; i++) fputs(buffer[i], stdout);
} else {
for (i = head; i < tail; i++) fputs(buffer[i], stdout);
}
fflush(stdout);
for (i = 0; i < lines; i++) free(buffer[i]);
free(buffer);
}
int main(int argc, char **argv)
{
char buffer[BUFSIZ];
size_t osize, nsize;
FILE *str;
const char *filename;
int count;
//setlocale(LC_ALL, "");
//bindtextdomain(PACKAGE, LOCALEDIR);
//textdomain(PACKAGE);
if (argc != 2) {
fprintf(stderr, _("Usage: tailf logfile\n"));
exit(1);
}
filename = argv[1];
tailf(filename, 10);
for (osize = filesize(filename);;) {
nsize = filesize(filename);
if (nsize != osize) {
if (!(str = fopen(filename, "r"))) {
fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
perror(argv[0]);
exit(1);
}
if (!fseek(str, osize, SEEK_SET))
while ((count = fread(buffer, 1, sizeof(buffer), str)) > 0)
fwrite(buffer, 1, count, stdout);
fflush(stdout);
fclose(str);
osize = nsize;
}
usleep(250000); /* 250mS */
}
return 0;
}
第二步:首先确保当前目录在/usr/local下,如果不在该目录下,请使用cd命令切换到/usr/local。然后编译c语言程序:
[root@localhost local]# gcc -o /usr/bin/tailf tailf.c
出现以上提示信息表示当前系统中没有gcc编译器,需要安装,输入y表示同意安装,再有提示,则继续输入y即可。
第三步:测试tailf命令是否可用,直接输入tailf会出现以下提示,表示tailf命令可以使用了。
tailf命令和“tail -f”一个效果,都是用来实时监控文件变动的。只不过tailf是专业的只负责监控日志文件变化的一个命令。我们来测试一下。
日志文件内容如下:
日志信息第1行
日志信息第2行
日志信息第3行
日志信息第4行
日志信息第5行
日志信息第6行
日志信息第7行
日志信息第8行
日志信息第10行
日志信息第11行
日志信息第12行
日志信息第13行
日志信息第14行
日志信息第15行
日志信息第16行
日志信息第17行
日志信息第18行
日志信息第19行
日志信息第20行
执行以下命令:
tailf localhost.log
执行结果:
可以再开启一个新的命令窗口,然后向日志文件中追加内容,如下:
这时可以看到tailf命令窗口如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现