1. 写在前面

本文主要介绍 Linux tail 命令:可用于查看文件的内容,有一个常用的参数 -f 常用于查阅实时更新的日志文件。

关注 公众号 获取最新博文: 滑翔的纸飞机

2. tail 命令

tail 命令的基本语法是:

tail [OPTION]... [FILE]...

示例准备两个文件:state.txt 和 capital.txt,包含国家和城市名称。

MacBook-Pro:tail dev$ cat state.txt
---------------------------------------------------
China
Mongolia
North Korea
South Korea
Japan
Philippines
Vietnam
Laos
Cambodia
Myanmar
Thailand
Malaysia
Brunei Darussalam
Singapore
Indonesia
East Timor
Nepal
Bhutan
Bengal
India
Pakistan
Sri Lanka
Maldives
Kazakhstan
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran
MacBook-Pro:tail dev$ cat capital.txt
---------------------------------------------------
Beijing
Shanghai
Guangzhou
Shenzhen
Tianjin
Hong Kong
Nanking
Macau
Tibet
Sian
chu-hai
TienTisn
ChengTu
Foochow
Kweilin
Ningpo
Swatow
Teochew
Kityall
Foochow
Tsamkong
tientsin
yangchow
soochow
Kaying
Lahsa
Hohhot

默认,不带任何选项,则只显示指定文件的最后 10 行。

例如:

MacBook-Pro:tail dev$ tail state.txt
---------------------------------------------------
Sri Lanka
Maldives
Kazakhstan
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran

参数:

参数 描述
-f/-F 循环读取
-q 不显示处理信息
-c 显示指定字节数
-n 显示文件的尾部 n 行内容
-q 不输出文件名
-r 输出按行以相反顺序显示,此外,该选项还会改变 -b、-c 和 -n 选项

2.1 示例

(1)-n num 显示文件的尾部 n 行内容

必须在命令中指定 "num",否则会显示错误。该命令也可以不使用符号 "n",但必须使用"-"号。

MacBook-Pro:tail dev$ tail -n 3 state.txt
---------------------------------------------------
Afghanistan
Iraq
Iran
MacBook-Pro:tail dev$ tail -3 state.txt
---------------------------------------------------
Afghanistan
Iraq
Iran

tail 命令还带有 head 命令中没有的 +选项。有了这个选项,tail 命令将从指定的文件行号开始打印数据,而不是打印到文件末尾。如命令:tail +n file_name,数据将从行号n开始打印,直到指定文件的末尾。

MacBook-Pro:tail dev$ tail +30 state.txt
---------------------------------------------------
Iraq
Iran

(2)-c num 显示指定字节数

打印指定文件的最后 num字节。换行符算作一个字符,因此如果 tail 打印出换行符,它将算作一个字节。在该选项中,必须写入 -c,然后根据需要写入正数或负数。如果使用 +num,则显示从指定文件开始跳过 num 字节后的所有数据;如果使用 -num,则显示指定文件的最后 num 字节。

**注意:**如果 num 前没有正负号,命令将显示指定文件的最后 num 字节。

负数:显示最后5个字节数据;

MacBook-Pro:tail dev$ tail -c -5 state.txt
---------------------------------------------------
Iran

或者:
MacBook-Pro:tail dev$ tail -c 5 state.txt
---------------------------------------------------
Iran

正数:文件开始跳过260字节后打印所有数据;

MacBook-Pro:tail dev$ tail -c +260 state.txt
---------------------------------------------------
istan
Afghanistan
Iraq
Iran

(3)-q 不输出文件名

如果给出的文件超过 1 个,则使用该命令。使用该命令时,每个文件中的数据前面都没有文件名。

不使用 -q 选项:输出文件名;

MacBook-Pro:tail dev$ tail state.txt capital.txt
---------------------------------------------------
==> state.txt <==
Sri Lanka
Maldives
Kazakhstan
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran

==> capital.txt <==
Teochew
Kityall
Foochow
Tsamkong
tientsin
yangchow
soochow
Kaying
Lahsa
Hohhot

使用 -q 选项:不输出文件名;

MacBook-Pro:tail dev$ tail -q state.txt capital.txt
---------------------------------------------------
Sri Lanka
Maldives
Kazakhstan
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran
Teochew
Kityall
Foochow
Tsamkong
tientsin
yangchow
soochow
Kaying
Lahsa
Hohhot

(4)-f 循环读取

-f选项一起调用时,Linux tail 命令会监控指定的文件。如果删除该文件,输出将被取消。正如开头所解释的,日志文件会定期轮换。因此,新文件将以旧文件名创建。要在日志文件轮换后继续监控该文件,我们可以使用 -F选项:

tail -f logfile

或

tail -F logfile

监控多个日志文件的变化:

tail -f ./*.log

(5)-r 按行以相反顺序显示

未使用-r选项:按行输出;

MacBook-Pro:tail dev$ jpzhang$ tail -n 10 state.txt
---------------------------------------------------
Sri Lanka
Maldives
Kazakhstan
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran

使用-r选项:按行相反输出;

MacBook-Pro:tail dev$ tail -r -n 10 state.txt
---------------------------------------------------
Iran
Iraq
Afghanistan
Turkmenistan
Uzbekistan
Tajikistan
Kyrgyzstan
Kazakhstan
Maldives
Sri Lanka

(6)管道(|)

tail 命令可以与许多其他 unix 命令进行管道连接。在下面的示例中,tail 命令的输出将作为带有 -r 选项的 sort 命令的输入,以对来自文件 state.txt 的最后 7 个名称按相反顺序进行排序。

未排序:

MacBook-Pro:tail dev$ tail -n 7 state.txt
---------------------------------------------------
Kyrgyzstan
Tajikistan
Uzbekistan
Turkmenistan
Afghanistan
Iraq
Iran

逆序:

MacBook-Pro:tail dev$ tail -n 7 state.txt | sort -r
---------------------------------------------------
Uzbekistan
Turkmenistan
Tajikistan
Kyrgyzstan
Iraq
Iran
Afghanistan

它还可以与一个或多个过滤器进行管道连接,以进行额外处理。在下面的示例中,我们使用了 catheadtail 命令,并使用指令(>)将其输出存储在名为 list.txt 的文件中。

MacBook-Pro:tail dev$ cat state.txt | head -n 20 | tail -n 5  > list.txt
MacBook-Pro:tail dev$ cat list.txt
---------------------------------------------------
East Timor
Nepal
Bhutan
Bengal
India

首先,cat 命令输出 state.txt 文件中的所有数据,然后管道将 cat 命令的所有输出转到 head 命令。head 命令输出从开始(第 1 行)到第 20 行的所有数据,然后管道将 head 命令的所有输出转到 tail 命令。现在,tail 命令输出最后 5 行数据,并通过(>)指令操作符将输出转入文件 list.txt。

至此,在Linux中使用tail命令有一个基础了解。 它是head命令的补充,关注公众号,后续更新head命令的使用。

感谢您花时间阅读文章!

关注公众号不迷路!