Skip to content

文本处理命令

字数: 6183 字 时长: 23 分钟

在 Linux 系统中,文本处理是一项非常重要的任务,因为许多系统配置、日志文件、数据记录等都是以文本形式存储的。文本处理的核心目标是通过各种工具和命令,对文本数据进行操作、分析和转换,以满足不同的需求。无论是日常的系统管理、数据分析,还是自动化脚本编写,文本处理都扮演着关键角色。

cat(显示文件内容)

cat 是 Linux 中最基础且常用的命令之一,它的名字来源于 concatenate(连接),最初设计用于连接多个文件的内容。不过,它最常用的功能是显示文件内容。

shell
cat [OPTION]... [FILE]...
常见选项作用
-n显示行号(包括空行)。
-b显示行号(忽略空行)。
-s将连续的空行压缩为一行。
-E在每行末尾显示 $ 符号。
-T将制表符(Tab)显示为 ^I
-A显示所有控制字符(如换行符、制表符等)。
参数作用
FILE可以是一个或多个文件。如果不指定文件,cat 会从标准输入(键盘)读取内容。

cat 命令在查看文件内容时,会将文件内容一次性输出到终端,不考虑文件的大小。如果文件非常大,大量的内容会迅速滚过屏幕,导致文件开头的内容一闪而过,难以查看。虽然可以使用 PgUp 键配合上箭头键尝试向上翻页查看之前的内容,但这种方式是有局限性的。因为终端的缓冲区大小是有限的,当文件内容超出了终端缓冲区的容量时,超出部分的内容就无法通过翻页的方式再查看到了。

示例文件:

shell
Hello, this is line 1.

This is line 3.
Line 4 has some    tabs.

Line 6 is empty.

Line 8 is the last line.
  1. 显示文件内容

    shell
    [root@localhost ~]# cat file.txt 
    Hello, this is line 1.
    
    This is line 3.
    Line 4 has some    tabs.
    
    Line 6 is empty.
    
    Line 8 is the last line.

    将 file.txt 的内容输出到终端。

  2. 显示多个文件内容

    shell
    [root@localhost ~]# cat file.txt file1.txt 
    Hello, this is line 1.
    
    This is line 3.
    Line 4 has some    tabs.
    
    Line 6 is empty.
    
    Line 8 is the last line.
    The is file1.txt

    显示多个文件时会依次显示内容。

  3. 显示行号

    shell
    [root@localhost ~]# cat -n file.txt
        1  Hello, this is line 1.
        2
        3  This is line 3.
        4  Line 4 has some    tabs.
        5
        6
        7
        8  Line 6 is empty.
        9
        10  Line 8 is the last line.

    显示 file.txt 的内容,并在每行前加上行号。如果想忽略空号显示行号可以使用选项 -b

    shell
    [root@localhost ~]# cat -b file.txt
        1  Hello, this is line 1.
    
        2  This is line 3.
        3  Line 4 has some    tabs.
    
        4  Line 6 is empty.
    
        5  Line 8 is the last line.
  4. 压缩空行

    shell
    [root@localhost ~]# cat -s file.txt
    Hello, this is line 1.
    
    This is line 3.
    Line 4 has some    tabs.
    
    Line 6 is empty.
    
    Line 8 is the last line.

    将 file.txt 中的连续空行压缩为一行。

  5. 显示控制字符

    shell
    [root@localhost ~]# cat -A file.txt
    Hello, this is line 1.$
    $
    This is line 3.$
    Line 4 has some    tabs.$
    $
    Line 6 is empty.$
    $
    Line 8 is the last line.$

    显示 file.txt 的内容,并显示换行符($)和制表符(^I)。

  6. 创建和追加文件

    创建文件和追加内容并不是 cat 命令本身的功能,而是通过 Shell 的重定向操作符(>>>)实现的。cat 只是用于读取输入并将其输出到标准输出(通常是终端),而重定向操作符将输出重定向到文件。

    shell
    [root@localhost ~]# cat > newfile.txt
    123
    [root@localhost ~]#

    从键盘输入内容,按 Ctrl+D 结束输入,内容会保存到 newfile.txt 中:

    shell
    [root@localhost ~]# cat newfile.txt 
    123

    如果想要追加内容可以使用 >> 实现:

    shell
    [root@localhost ~]# cat >> newfile.txt
    456
    [root@localhost ~]#

    从键盘输入内容,按 Ctrl+D 结束输入,内容会追加到 newfile.txt 的末尾:

    shell
    [root@localhost ~]# cat newfile.txt 
    123
    456
  7. 连接多个文件并输出到新文件

    shell
    [root@localhost ~]# cat file.txt newfile.txt > combined.txt

    将 file.txt 和 newfile 的内容合并,并保存到 combined.txt 中:

    shell
    [root@localhost ~]# cat combined.txt 
    Hello, this is line 1.
    
    This is line 3.
    Line 4 has some    tabs.
    
    Line 6 is empty.
    
    Line 8 is the last line.
    123
    456

more(分页显示文件)

more 是一个经典的 Linux 文本查看工具,用于分页显示文件内容,可以逐页显示文件内容,方便用户查看。它适合查看较大的文件,避免一次性加载整个文件内容到终端。

shell
 more [options] file...
常见选项作用
-d显示提示信息(如 Press space to continue, 'q' to quit)。
-f强制处理长行(不自动换行)。
-p不滚屏,而是在显示每一屏之前,先清除屏幕。
-c-p 选项的作用相同。不过,-c 选项在某些版本的 more 命令中可能还包含一些额外的细微行为,比如在某些情况下可能会更彻底地清除屏幕,包括光标位置等。
-s将连续的空行压缩为一行。
-num指定每页显示的行数(如 more -10 file.txt 每页显示 10 行)。
+/pattern从文件中匹配 pattern 的第一行开始显示。

more 命令的执行会打开一个交互界面,可以使用以下按键操作:

按键描述
space空格键,向下移动一页。
Enter空格键,向下移动一行。
q退出 more。
h显示 more 命令交互命令帮助。
v在当前行启动一个编辑器。
:+f显示当前文件的文件名和行号。
b回退到上一页。
d向下移动半页。

常见用法示例:

  1. 查看文件
shell
[root@localhost ~]# more anaconda-ks.cfg
# Generated by Anaconda 34.25.5.9
# Generated by pykickstart v3.32
#version=RHEL9
# Use graphical install
graphical
repo --name="minimal" --baseurl=file:///run/install/sources/mount-0000-cdrom/minimal

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

# Keyboard layouts
keyboard --xlayouts='cn'
# System language
lang zh_CN.UTF-8

# Use CDROM installation media
cdrom

%packages
@^minimal-environment

%end
--More--(51%)

在这个例子中,--More--(51%)more 命令的提示信息,表示当前显示的内容占整个文件的 51%。此时,more 已经暂停输出,等待用户输入命令来继续浏览文件内容。

  1. 显示每 10 行显示一屏,并清除屏幕
shell
# Generated by Anaconda 34.25.5.9
# Generated by pykickstart v3.32
#version=RHEL9
# Use graphical install
graphical
repo --name="minimal" --baseurl=file:///run/install/sources/mount-0000-cdrom/minimal

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end
--More--(31%)

less(分页查看文件)

less 命令是一个功能强大的文本文件查看器,用于在终端中分页显示文本文件内容。与 more 命令相比,less 提供了更多的功能和更灵活的操作方式,支持向前翻页、搜索内容、高亮显示匹配项等,非常适合查看和浏览大型文本文件。

shell
 more [options] file...
常见选项作用
-N在每行前显示行号。
-g只高亮显示最后一次搜索的字符串。
-G不显示搜索不到的字符串的提示信息。
-i忽略大小写进行搜索。
-m显示类似 more 命令的百分比信息。
-n不显示行号,但可以加快文件的显示速度。
-p开始时搜索字符串并显示包含该字符串的那一屏。
-s压缩连续的空行显示为一行。
-S当行太长时,截断显示,不换行显示。

在使用 less 命令查看文件内容的过程中,和 more 命令一样,也会进入交互界面:

按键描述
space空格键,向下移动一页。
Enter空格键,向下移动一行。
b回退到上一页。
q退出 less。
/输入 / 后跟搜索内容再按回车,向下搜索指定的内容,例如 /error 会搜索文件中下一个出现 error 的位置,并高亮显示。
?输入 ? 后跟搜索内容再按回车,向上搜索指定的内容,例如 ?warning 会搜索文件中上一个出现 warning 的位置,并高亮显示。
n重复上一次的搜索操作,向下查找下一个匹配项。
N反向重复上一次的搜索操作,向上查找上一个匹配项。

Linux 日志中有一个名为 /var/log/messages 的文件,通常用于记录系统的各种事件和消息,其内容非常多,超出了终端屏幕的显示范围。执行命令后,终端会显示文件的前一页内容:

shell
[root@localhost ~]# less /var/log/messages
Jan  8 08:23:27 localhost kernel: The list of certified hardware and cloud instances for Enterprise Linux 9 can be viewed at the Red Hat Ecosystem Catalog, https://catalog.redhat.com.
Jan  8 08:23:27 localhost kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-503.14.1.el9_5.x86_64 root=/dev/mapper/rl-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap
Jan  8 08:23:27 localhost kernel: BIOS-provided physical RAM map:
Jan  8 08:23:27 localhost kernel: BIOS-e820: [mem 0x0000000000000000-0x0000000000098bff] usable
Jan  8 08:23:27 localhost kernel: BIOS-e820: [mem 0x0000000000098c00-0x000000000009ffff] reserved

:
……

此时,可以看到,less 在屏幕底部显示一个冒号(:),等待用户输入命令,可以按 空格键 查看下一页内容,按 b 键回退到上一页,按 j 键或下箭头键向下滚动一行,按 k 键或上箭头键向上滚动一行。如果想退出查看,按 q 键即可。

如果想从文件的第 50 行开始查看,可以执行 less +50 /var/log/messages 命令,终端会直接从第 50 行开始分页显示文件内容:

shell
[root@localhost ~]# less +50 -N /var/log/messages
……
     50 Jan  8 08:23:27 localhost kernel: ACPI: Reserving FACS table memory at [mem 0x7fefffc0-     50 0x7fefffff]
     51 Jan  8 08:23:27 localhost kernel: ACPI: Reserving FACS table memory at [mem 0x7fefffc0-     51 0x7fefffff]
     52 Jan  8 08:23:27 localhost kernel: ACPI: Reserving BOOT table memory at [mem 0x7feead2d-     52 0x7feead54]
     53 Jan  8 08:23:27 localhost kernel: ACPI: Reserving APIC table memory at [mem 0x7feea5eb-     53 0x7feead2c]
……

如果想搜索文件中包含 error 的内容,可以按 / 键,输入 error,然后按回车键,less 会高亮显示下一个出现 error 的位置。按 n 键可以继续向下查找下一个匹配项,按 N 键可以向上查找上一个匹配项。

head(显示文件头部)

head 命令用于查看文件的开头部分,默认情况下显示文件的前 10 行。这个命令非常适合快速查看文件的开始内容,尤其是当文件内容较多时,可以快速确认文件的格式和内容。

shell
head [OPTION]... [FILE]...
常见选项作用
-n指定要显示的行数。默认值为 10,可以自定义显示的行数。例如,-n 20 表示显示前 20 行。
-c指定要显示的字符数。例如,-c 100 表示显示文件的前 100 个字符。
-q在处理多个文件时,不输出文件名。
-v即使文件为空,也输出文件名。

常见用法示例:

  1. 显示文件的前 10 行(默认行为)

    shell
    [root@localhost ~]# head anaconda-ks.cfg 
    # Generated by Anaconda 34.25.5.9
    # Generated by pykickstart v3.32
    #version=RHEL9
    # Use graphical install
    graphical
    repo --name="minimal" --baseurl=file:///run/install/sources/mount-0000-cdrom/minimal
    
    %addon com_redhat_kdump --enable --reserve-mb='auto'
    
    %end
  2. 显示文件的前 5 行

    shell
    [root@localhost ~]# head -n 5 anaconda-ks.cfg 
    # Generated by Anaconda 34.25.5.9
    # Generated by pykickstart v3.32
    #version=RHEL9
    # Use graphical install
    graphical
  3. 显示文件的前 100 个字节

    shell
    [root@localhost ~]# head -c 100 anaconda-ks.cfg 
    # Generated by Anaconda 34.25.5.9
    # Generated by pykickstart v3.32
    #version=RHEL9
    # Use graphical in[root@localhost ~]# head -c100 anaconda-ks.cfg 
    # Generated by Anaconda 34.25.5.9
    # Generated by pykickstart v3.32
    #version=RHEL9
    # Use graphical in
  4. 显示多个文件的前 10 行

    shell
    [root@localhost ~]# head -n 3 anaconda-ks.cfg file.txt 
    ==> anaconda-ks.cfg <==
    # Generated by Anaconda 34.25.5.9
    # Generated by pykickstart v3.32
    #version=RHEL9
    
    ==> file.txt <==
    Hello, this is line 1.
    
    This is line 3.

tail(显示文件尾部)

tail 命令用于查看文件的末尾部分,默认情况下显示文件的最后 10 行。这个命令非常适合快速查看文件的最新内容,尤其是日志文件,因为日志文件通常会不断追加新的记录。

shell
tail [OPTION]... [FILE]...
常见选项作用
-n指定要显示的行数。默认值为 10,可以自定义显示的行数。例如,-n 20 表示显示最后 20 行。
-c指定要显示的字符数。例如,-c 100 表示显示文件的最后 100 个字符。
-f持续输出文件的最新内容,常用于实时查看日志文件的更新。当文件内容更新时,新内容会立即显示在终端上。
-q在处理多个文件时,不输出文件名。
-v即使文件为空,也输出文件名。

其他用法和 haed 命令类似,tail -f 命令用于实时监控文件的更新,当文件内容更新时,新内容会立即显示在终端上,光标会停留在终端的最底部,等待新的内容出现。这种行为使得 tail -f 命令非常适合用于监控日志文件的实时变化:

shell
tail -f /var/log/messages

执行这个命令后,终端会显示 /var/log/messages 文件的最后 10 行内容。然后,光标会停留在终端的最底部,等待新的日志记录出现。每当系统生成新的日志记录并追加到 /var/log/messages 文件时,这些新记录会立即显示在终端上。

要退出 tail -f 命令,可以按 Ctrl + c 组合键。这会发送一个中断信号给 tail 命令,使其停止运行并返回到命令行提示符。

sort(对文件排序)

sort 命令用于对文本文件的内容进行排序。它可以按照字母顺序、数值大小、日期时间等不同的方式进行排序,并且可以处理单个文件或多个文件的合并排序。sort 命令默认按照字母顺序对文件的每一行进行排序。

shell
sort [OPTION]... [FILE]...
排序规则作用
-n按照数值大小进行排序,而不是默认的字母顺序。
-r按照逆序(降序)进行排序。
-g按照通用数值格式进行排序,可以处理科学计数法等格式的数值。
-h按人类可读的数字排序(例如 2K、1G)。
-f忽略大小写(不区分大小写排序)。
-M按照月份进行排序,适用于包含月份名称的字段。
-V按照版本号进行排序,适用于软件版本号等格式。
字段处理作用
-k KEYDEF指定按照文件中的哪一列进行排序。列号从 1 开始,可以指定多个列进行复合排序。例如,-k 2 表示按照第二列进行排序,-k 2,3 表示排序的键从第二列开始,到第三列结束。这意味着排序时会考虑第二列和第三列的组合内容作为一个整体键进行排序。
-t指定字段分隔符。默认情况下,字段分隔符是空格或制表符。例如,-t , 表示字段分隔符是逗号。
去重与合并作用
-u去重(只保留唯一的行)。
-m合并已排序的文件(不重新排序)。
输出控制作用
-o [FILE]将排序结果输出到指定文件,而不是标准输出。这个选项非常有用,尤其是当需要将排序结果保存到一个文件中时。
-c检查文件是否已排序。如果文件已经排序,命令会成功执行并返回 0;如果文件未排序,命令会输出第一个无序的行并返回非 0 值。这个选项非常适合用于验证文件是否已经排序。
-s进行稳定排序。在排序过程中,保持相等行的原始顺序。这对于某些需要保持原始顺序的场景非常有用,例如,当先按一列排序,再按另一列排序时,使用 -s 可以确保第一列相等的行保持原始顺序。

示例文件:

shell
103,Alice Johnson,1992-03-10,Chicago,5500,192.168.159.123
102,Jane Smith,1985-05-20,Los Angeles,6000,192.163.1.1
101,John Doe,1990-01-15,New York,5000,192.168.1.20
105,Charlie Davis,1991-11-30,Seattle,5800,192.168.1.125
104,Bob Brown,1988-07-25,San Francisco,5200,192.168.20.20
  1. 按 ID 排序

    shell
    [root@localhost ~]# sort -t ',' -k 1n employees.csv
    101,John Doe,1990-01-15,New York,5000,192.168.1.20
    102,Jane Smith,1985-05-20,Los Angeles,6000,192.163.1.1
    103,Alice Johnson,1992-03-10,Chicago,5500,192.168.159.123
    104,Bob Brown,1988-07-25,San Francisco,5200,192.168.20.20
    105,Charlie Davis,1991-11-30,Seattle,5800,192.168.1.125

    这个命令会读取 employees.csv 文件,使用逗号(,)作为字段分隔符,按第一列(用户 ID)进行数值排序,并输出排序后的结果。

  2. 按姓名排序

    shell
    [root@localhost ~]# sort -t ',' -k 2 employees.csv
    103,Alice Johnson,1992-03-10,Chicago,5500,192.168.159.123
    104,Bob Brown,1988-07-25,San Francisco,5200,192.168.20.20
    5,Charlie Davis,1991-11-30,Seattle,5800,192.168.1.125
    22,Jane Smith,1985-05-20,Los Angeles,6000,192.163.1.1
    101,John Doe,1990-01-15,New York,5000,192.168.1.20
  3. 按出生日期排序

    shell
    [root@localhost ~]# sort -t ',' -k 5nr employees.csv
    22,Jane Smith,1985-05-20,Los Angeles,6000,192.163.1.1
    5,Charlie Davis,1991-11-30,Seattle,5800,192.168.1.125
    103,Alice Johnson,1992-03-10,Chicago,5500,192.168.159.123
    104,Bob Brown,1988-07-25,San Francisco,5200,192.168.20.20
    101,John Doe,1990-01-15,New York,5000,192.168.1.20
  4. 按 IP 地址排序

    shell
    [root@localhost ~]# sort -t ',' -k 6V employees.csv
    22,Jane Smith,1985-05-20,Los Angeles,6000,192.163.1.1
    101,John Doe,1990-01-15,New York,5000,192.168.1.20
    5,Charlie Davis,1991-11-30,Seattle,5800,192.168.1.125
    104,Bob Brown,1988-07-25,San Francisco,5200,192.168.20.20
    103,Alice Johnson,1992-03-10,Chicago,5500,192.168.159.123

    IP 地址是由点号 . 分隔的四个数字组成的字符串。sort 默认按字符串的字典序排序,而不是按数字的数值排序。例如:

    • 192.168.1.125 的字典序比 192.168.1.20 小,因为 125 的第一个字符 1 比 20 的第一个字符 2 小。

    sort-V 选项可以按版本号排序,适合处理 IP 地址。

  5. 将排序结果保存到文件

    shell
    sort -t ',' -k 5n employees.csv -o sorted_employees.csv

    将排序结果保存到 sorted_employees.csv 文件。

uniq(删除重复行)

uniq 命令用于去除文本文件中连续重复的行,常用于处理已经排序的文件。它可以帮助简化文件内容,去除重复的行,使文件更加简洁。但是 uniq 命令有其局限性,主要在于它只能去除连续重复的行。这意味着如果重复的行不连续,uniq 命令将无法检测到它们。因此,通常在使用 uniq 命令之前,会先使用 sort 命令对文件进行排序,以确保所有相同的行都是连续的。

shell
uniq [OPTION]... [INPUT [OUTPUT]]
  • INPUT:输入文件名。如果省略,uniq 命令将从标准输入(通常是管道或重定向)读取数据。
  • OUTPUT:输出文件名。如果省略,uniq 命令将结果输出到标准输出(通常是终端)。
常用选项作用
-c在每行前显示该行出现的次数。
-d仅显示重复的行。
-u仅显示不重复的行。
-i忽略大小写进行比较。
-f N跳过前 N 列进行比较。
-s N跳过每行前 N 个字符进行比较。

示例文件:

shell
apple
banana
orange
apple
grape
banana
apple
kiwi
orange
  1. 去除重复的行并且统计每行出现的次数

    shell
    [root@localhost ~]# uniq -c fruits.txt 
        1 apple
        1 banana
        1 orange
        1 apple
        1 grape
        1 banana
        1 apple
        3 kiwi
        1 orange

    可以看到 uniq 只能统计相邻的重复行,因此只有 kiwi 被正确统计为出现了 3 次。其他行(如 apple 和 banana)因为不相邻,所以每行都被标记为出现了 1 次。

    为了让 uniq 正确统计每行的出现次数,需要先对文件进行排序,使重复行相邻。可以使用 sort 命令来实现这一点:

    shell
    [root@localhost ~]# sort fruits.txt | uniq -c
        3 apple
        2 banana
        1 grape
        3 kiwi
        2 orange

    管道符

    管道符(|) 是 Linux/Unix 系统中一个非常强大的工具,用于将多个命令连接在一起。它的作用是将一个命令的输出作为另一个命令的输入,从而实现数据的流动和处理。

  2. 仅显示不重复的行

    shell
    [root@localhost ~]# uniq -u fruits.txt 
    apple
    banana
    orange
    apple
    grape
    banana
    apple
    orange

    可以看到,uniq 只能统计相邻的重复行,仅仅不显示 kiwi,所以还是需要使用 sort 命令配合:

    shell
    [root@localhost ~]# sort fruits.txt | uniq -u
    grape
  3. 仅显示重复的行

    shell
    [root@localhost ~]# sort fruits.txt | uniq -d
    apple
    banana
    kiwi
    orange

    同样,需要先使用 sort 进行排序,然后再使用 uniq 命令。

cut(提取文件列)

cut 命令用于从文本文件中提取特定的列或字段。它可以根据指定的分隔符或字节位置来提取内容,非常适合处理结构化的文本数据,如 CSV 文件、日志文件等。

shell
cut OPTION... [FILE]...
常用选项作用
-b按字节位置提取内容。可以指定一个或多个字节位置,例如 -b1,3,5 表示提取第 1、3、5 个字节。
-c按字符位置提取内容。可以指定一个或多个字符位置,例如 -c1,3,5 表示提取第 1、3、5 个字符。
-f按字段提取内容。需要配合 -d 选项指定字段分隔符,例如 -d',' -f1,3 表示按逗号分隔字段,提取第 1 和第 3 个字段。
-d指定字段分隔符。默认分隔符是制表符(\t),可以使用 -d 选项指定其他分隔符,例如 -d',' 表示逗号分隔。
-s只输出包含分隔符的行。如果某行不包含分隔符,则该行不会被输出。

示例文件:

shell
192.168.1.1 - - [14/Jan/2025:09:44:50 +0800] "GET / HTTP/1.1" 200 7620 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
192.168.1.2 - - [14/Jan/2025:09:44:51 +0800] "GET /favicon.ico HTTP/1.1" 404 3332 "http://192.168.1.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
192.168.1.3 - - [14/Jan/2025:09:44:52 +0800] "GET /poweredby.png HTTP/1.1" 200 368 "http://192.168.1.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
192.168.1.1 - - [14/Jan/2025:09:44:53 +0800] "GET / HTTP/1.1" 200 7620 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
  1. 提取每行的 IP 地址

    shell
    [root@localhost ~]# cut -d ' ' -f 1 access.log
    192.168.1.1
    192.168.1.2
    192.168.1.3
    192.168.1.1

    如果想统计每个 IP 地址出现的次数,可以结合 sortuniq

    shell
    [root@localhost ~]# cut -d ' ' -f 1 access.log | sort | uniq -c
        2 192.168.1.1
        1 192.168.1.2
        1 192.168.1.3
  2. 同时提取 IP 地址、时间和状态码

    shell
    [root@localhost ~]# cut -d' ' -f1,4,5,9 access.log
    192.168.1.1 [14/Jan/2025:09:44:50 +0800] 200
    192.168.1.2 [14/Jan/2025:09:44:51 +0800] 404
    192.168.1.3 [14/Jan/2025:09:44:52 +0800] 200
    192.168.1.1 [14/Jan/2025:09:44:53 +0800] 200
  3. 按 IP 地址的出现次数从高到低排序

    可以结合 sortuniq 命令:

    shell
    [root@localhost ~]# cut -d ' ' -f 1 access.log | sort | uniq -c | sort -nr
        2 192.168.1.1
        1 192.168.1.3
        1 192.168.1.2

wc(统计文件行数)

wc 是一个在 Unix 和 Linux 系统中常用的命令,用于统计指定文件中的行数、单词数和字节数等信息。它可以处理文本文件,并且可以根据不同的参数输出不同类型的统计结果。

shell
wc [OPTION]... [FILE]...
常用选项作用
-l统计文件中的行数。
-w统计文件中的单词数。
-c统计文件中的字节数。
-m统计文件中的字符数(包括空格和换行符)。
-L显示文件中最长行的长度。
  1. 统计行数

    shell
    [root@localhost ~]# wc -l /etc/passwd
    20 /etc/passwd

    输出结果中的 20 表示 /etc/passwd 文件中有 20 行数据。

  2. 统计单词数

    shell
    [root@localhost ~]# wc -w /etc/passwd
    38 /etc/passwd

    注意,wc 只会将连续的非空白字符视为一个单词,无论其中包含什么符号或字符。

  3. 统计字节数和字符数

    text
    Hello, 世界!
    shell
    [root@localhost ~]# wc -c wc.txt
    17 wc.txt
    [root@localhost ~]# wc -m wc.txt
    11 wc.txt

    -c 统计字节数,受文件编码的影响(例如中文字符在 UTF-8 编码中占 3 字节);而 -m 选项统计字符数,不管字符是字母、数字、标点符号还是空白字符。