那个老书生说,我们活在一个很复杂的世道里,很多人的言行,哪怕是学问极高的读书人,还是会自相矛盾,我们看多了没甚道理的事情,难免会问,是不是书上的道理,是错的,或者说,是那些道理还没有说透,没有说全。”
“那么问题来了,怎么办呢?我们该怎么看待这个许多嘴上讲道理、做事没道理的世界?办法是有的,一种是活得纯粹,我拳头很硬,剑术很强,道法很强,就用这些来打破一些东西。复杂问题给简单解决掉,只要我开心就好。天地有规矩约束我,我便一拳打破,世间有大道压我,我有一剑破万法。哪怕暂时做到如此酣畅淋漓,可总是如此想,坚定不移,一直朝这个方向走在道路上。这种人可以有,但是不能人人如此的。”一种是活得很聪明,怎么省心省力怎么来,规矩二字,就是用来钻漏洞的

查看文件内容的常见命令

  • cat
  • more 和 less
  • head 和 tail
  • nl
  • tailf

cat命令

语法:

1
2
3
4
5
6
7
8
用法:cat [选项]... [文件]...

常用选项:
-n, 对输出的所有行编号
-b, 对输出的所有行编号(不含空白行)
-t, 将制表符(tab)显示为^I
-e, 在每行结束处显示"$"
-s, 当连续空白行数量大于1时,合并为1个空白行

cat命令会一次性将文件的完整内容全部显示出来,不适合大文件。

查看文件所有内容

1
cat HelloWorld.java

查看文件所有内容,并且添加行号

1
cat -n HelloWorld.java

查看文件所有内容,添加行号,但空白行不加行号

1
cat -b HelloWorld.java

查看文件所有内容,将制表符显示为^I

1
cat -t HelloWorld.java

查看文件所有内容,在每行结束处显示”$”

1
cat -e HelloWorld.java

查看文件所有内容,合并多个连续的空白行为1个空白行

1
cat -s HelloWorld.java

一次查看多个文件

1
cat a.txt b.txt

使用cat合并文件

1
cat a.txt b.txt > c.txt

加上行号之后输出到另一个文件

1
cat -n HelloWorld.java > HelloWorld2.java

清空文件内容

1
cat /dev/null > HelloWorld.java

more命令

more命令和cat命令的相同点和不同点:

  • 相同点:more和cat在开始读取文件的时候,都是一次性的将文件全部内容装载到缓存中。
  • 不同点:cat是一次性的全部输出打印。more可以进行部分打印(一屏一屏的打印)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
用法:
more [选项] <文件>...

常用选项:
-<number> 每个屏幕的行数
+<number> 从行号开始显示文件
+/<pattern> 从匹配的位置前两行开始显示内容
-p 以清除原内容的方式进行翻页。

常用操作:
回车键 【显示下一行】
空格键 【显示下一页】
ctrl + b 【显示上一页】
= 【显示行号】
:f 【显示文件名的同时显示行号】
q 【退出more命令】

这里有日志文件:log.txt,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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行起,查看文件内容。

1
more +3 log.txt

案例2:每屏显示4条记录。

1
more -4 log.txt

案例3:从文件中查找”java”字符串的行

1
more +/java log.txt

案例4:查看进程,每5条为一屏,翻屏时清空原内容

1
ps -ef | more -5 -p

less命令

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。使用less 时,可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 中可以拥有更多的搜索功能。

less命令用法

有这样的一个文件:usernames.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
用法: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命令:显示文件头部内容。

1
2
3
4
5
6
7
8
用法:head [选项]... [文件]...
将每个指定文件的前 10 行输出到标准输出。
如果指定了多于一个文件,在每块输出之前附加文件名称作为头部。

参数:
-c 输出前几个字符
-n 指定行数
-q 不显示包含给定文件名的文件头

前三行:
image.png

前9个字符:
image.png

显示多个文件的前3行:
image.png

不带文件名标识:
image.png

tail命令

tail命令:显示文件尾部内容。

1
2
3
4
5
6
7
8
9
用法:tail [选项]... [文件]...
显示每个指定文件的最后 10 行并输出至标准输出。
若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头。

参数:
-c 输出最后几个字符
-f 随文件增长即时输出新增数据
-n 指定行数
-q 不输出文件名的头

默认显示文件末尾的后10行:
image.png

指定行数:
image.png

一次查看多个文件:
image.png

不显示文件名:
image.png

监控文件变化:
在窗口1中:
image.png
在窗口2中:
image.png
可以看到窗口1发生了变化:
image.png

标头.jpg

nl命令

nl命令是比较专业的显示行号的命令。
用法如下:

  • nl -b a 所有行添加行号,包括空白行;
  • nl -b t 给行添加行号,不包括空白行(默认行为,和直接使用 nl 一样效果);
  • nl -n ln 行号在自己栏位左侧显示;
  • nl -n rn 行号在自己栏位的右侧显示 ;
  • nl -n rz 显示行号,行号栏位不满时,自动补0 ;
  • nl -w 行号栏位的占用的位数。

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
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!");
}
}

执行以下命令:

1
nl HelloWorld.java

执行结果:
image.png
执行以下命令:显示所有行的行号,包括空白行。

1
nl -b a HelloWorld.java

执行结果:
image.png
执行以下命令:显示行号,不包括空白行。(这是一种默认的方式,和“nl HelloWorld.java”效果一样

1
nl -b t HelloWorld.java

image.png
执行以下命令:行号在行号栏位左侧显示

1
nl -n ln HelloWorld.java

执行结果:
image.png

执行以下命令:行号在行号栏位右侧显示

1
nl -n rn HelloWorld.java

执行结果:
image.png
执行以下命令:行号栏位自动补0

1
nl -n rz HelloWorld.java

执行结果:
image.png
执行以下命令:设置栏位的字符数量

1
nl -n rz -w 3 HelloWorld.java

执行结果:
image.png

tailf命令

与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件。tailf特别适合那些便携机上跟踪日志文件,因为它能省电,因为减少了磁盘访问。tailf命令不是个脚本,而是一个用C代码编译后的二进制执行文件,某些Linux安装之后没有这个命令。
CentOS系统是不支持该命令的,可以按照以下步骤添加这个命令:
第一步:cd命令切换到/usr/local目录下,新建tailf.c文件,该文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* 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语言程序:

1
[root@localhost local]# gcc -o /usr/bin/tailf tailf.c

image.png
出现以上提示信息表示当前系统中没有gcc编译器,需要安装,输入y表示同意安装,再有提示,则继续输入y即可。
第三步:测试tailf命令是否可用,直接输入tailf会出现以下提示,表示tailf命令可以使用了。
image.png
tailf命令和“tail -f”一个效果,都是用来实时监控文件变动的。只不过tailf是专业的只负责监控日志文件变化的一个命令。我们来测试一下。
日志文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
日志信息第1行
日志信息第2行
日志信息第3行
日志信息第4行
日志信息第5行
日志信息第6行
日志信息第7行
日志信息第8行
日志信息第10行
日志信息第11行
日志信息第12行
日志信息第13行
日志信息第14行
日志信息第15行
日志信息第16行
日志信息第17行
日志信息第18行
日志信息第19行
日志信息第20行

执行以下命令:

1
tailf localhost.log

执行结果:
image.png
可以再开启一个新的命令窗口,然后向日志文件中追加内容,如下:
image.png
这时可以看到tailf命令窗口如下:
image.png