第一章:Linux 文本查看

1.1 cat 命令:连接文件并打印输出到标准输出设备

cat 命令可以用来显示文本文件的内容(类似于 DOS 下的 type 命令),也可以把几个文件内容附加到另一个文件中,即连接合并文件。关于此命令,有人认为写 cat 命令的人是因为喜欢猫,因此给此命令起名为“cat”,其实不然,cat 是 concatenate(连接、连续)的简写。

1.1.1 语法格式

cat 命令的基本格式如下:

  1. [root@localhost ~]# cat [选项] 文件名
  2. 或者
  3. [root@localhost ~]# cat 文件1 文件2 > 文件3

这两种格式中,前者用于显示文件的内容,常用选项及各自的含义如表 1 所示;而后者用于连接合并文件。

选项 含义
-A 相当于 -vET 选项的整合,用于列出所有隐藏符号;
-E 列出每行结尾的回车符 $;
-n 对输出的所有行进行编号;
-b 同 -n 不同,此选项表示只对非空行进行编号。
-T 把 Tab 键 ^I 显示出来;
-V 列出特殊字符;
-s 当遇到有连续 2 行以上的空白行时,就替换为 1 行的空白行。

表 1 cat 命令常用选项及含义
注意,cat 命令用于查看文件内容时,不论文件内容有多少,都会一次性显示。如果文件非常大,那么文件开头的内容就看不到了。不过 Linux 可以使用 PgUp+上箭头 组合键向上翻页,但是这种翻页是有极限的,如果文件足够长,那么还是无法看全文件的内容。
因此,cat 命令适合查看不太大的文件。当然,在 Linux 中是可以使用其他的命令或方法来查看大文件的,我们以后再来学习。

1.1.2 例子

例 1

cat 命令本身非常简单,我们可以直接查看文件的内容。例如:

  1. [root@localhost ~]# cat anaconda-ks.cfg
  2. # Kickstart file automatically generated by anaconda.
  3. #version=DEVEL
  4. install
  5. cdrom
  6. lang zhCN.UTF-8
  7. …省略部分内容...

而如果使用 -n 选项,则会显示行号。例如:

  1. [root@localhost ~]# cat -n anaconda-ks.cfg
  2. 1 # Kickstart file automatically generated by anaconda.
  3. 2
  4. 3
  5. 4 #version=DEVEL
  6. 5 install
  7. 6 cdrom
  8. …省略部分内容...

如果使用 -A 选项,则相当于使用了 -vET 选项,可以查看文本中的所有隐藏符号,包括回车符 $、Tab 键 ^I 等。例如:

例 2

将文件 file1.txt 和 file2.txt 的内容合并后输出到文件 file3.txt 中。

  1. [root@localhost base]# ls
  2. file1.txt file2.txt
  3. [root@localhost base]# cat file1.txt
  4. http://c.biancheng.net(file1.txt)
  5. [root@localhost base]# cat file2.txt
  6. is great(file2.txt)
  7. [root@localhost base]# cat file1.txt file2.txt > file3.txt
  8. [root@localhost base]# more file3.txt
  9. #more 命令可查看文件中的内容
  10. http://c.biancheng.net(file1.txt)
  11. is great(file2.txt)
  12. [root@localhost base]# ls
  13. file1.txt file2.txt file3.txt

1.2 head 命令:显示文件开头的内容

1.2.1 语法格式

head 命令可以显示指定文件前若干行的文件内容,其基本格式如下:
[root@localhost ~]# head [选项] 文件名
该命令常用选项以及各自的含义,如表 1 所示。

选项 含义
-n K 这里的 K 表示行数,该选项用来显示文件前 K 行的内容;如果使用 “-K” 作为参数,则表示除了文件最后 K 行外,显示剩余的全部内容。
-c K 这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容;如果使用 “-K”,则表示除了文件最后 K 字节的内容,显示剩余全部内容。
-v 显示文件名;

表 1 head 命令常用选项及含义
注意,如不设置显示的具体行数,则默认显示 10 行的文本数据。

1.2.2 例子

例 1

**_[root__@localhost__ ~]__# head anaconda-ks.cfg_**
head 命令默认显示文件的开头 10 行内容。如果想显示指定的行数,则只需使用 -n 选项即可,例如:
**_[root__@localhost__ ~]__# head -n 20 anaconda-ks.cfg_**
这是显示文件的开头 20 行内容,也可以直接写 -行数,例如:
**_[root__@localhost__ ~]__# head -20 anaconda-ks.cfg_**

1.3 less 命令:查看文件内容

less 命令的作用和 more 十分类似,都用来浏览文本文件中的内容,不同之处在于,使用 more 命令浏览文件内容时,只能不断向后翻看,而使用 less 命令浏览,既可以向后翻看,也可以向前翻看。
不仅如此,为了方面用户浏览文本内容,less 命令还提供了以下几个功能:

  • 使用光标键可以在文本文件中前后(左后)滚屏;
  • 用行号或百分比作为书签浏览文件;
  • 提供更加友好的检索、高亮显示等操作;
  • 兼容常用的字处理程序(如 Vim、Emacs)的键盘操作;
  • 阅读到文件结束时,less 命令不会退出;
  • 屏幕底部的信息提示更容易控制使用,而且提供了更多的信息。

    1.3.1 语法格式

    less 命令的基本格式如下:
    **_[root@localhost ~]# less [选项] 文件名_**
    此命令可用的选项以及各自的含义如表 1 所示。
选项 选项含义
-N 显示每行的行号。
-S 行过长时将超出部分舍弃。
-e 当文件显示结束后,自动离开。
-g 只标志最后搜索到的关键同。
-Q 不使用警告音。
-i 忽略搜索时的大小写。
-m 显示类似 more 命令的百分比。
-f 强迫打开特殊文件,比如外围设备代号、目录和二进制文件。
-s 显示连续空行为一行。
-b <缓冲区大小> 设置缓冲区的大小。
-o <文件名> 将 less 输出的内容保存到指定文件中。
-x <数字> 将【Tab】键显示为规定的数字空格。

表 1 less 命令选项及含义
在使用 less 命令查看文件内容的过程中,和 more 命令一样,也会进入交互界面,因此需要读者掌握一些常用的交互指令,如表 2 所示。

交互指令 功能
/字符串 向下搜索“字符串”的功能。
?字符串 向上搜索“字符串”的功能。
n 重复*前一个搜索(与 / 成 ? 有关)。
N 反向重复前一个搜索(与 / 或 ? 有关)。
b 向上移动一页。
d 向下移动半页。
h 或 H 显示帮助界面。
q 或 Q 退出 less 命令。
y 向上移动一行。
空格键 向下移动一页。
回车键 向下移动一行。
【PgDn】键 向下移动一页。
【PgUp】键 向上移动一页。
Ctrl+f 向下移动一页。
Ctrl+b 向上移动一页。
Ctrl+d 向下移动一页。
Ctrl+u 向上移动半页。
j 向下移动一行。
k 向上移动一行。
G 移动至最后一行。
g 移动到第一行。
ZZ 退出 less 命令。
v 使用配置的编辑器编辑当前文件。
[ 移动到本文档的上一个节点。
] 移动到本文档的下一个节点。
p 移动到同级的上一个节点。
u 向上移动半页。

表 2 less 交互指令及功能

1.3.2 例子

例 1

使用 less 命令查看 /boot/grub/grub.cfg 文件中的内容。

  1. [root@localhost ~]# less /boot/grub/grub.cfg
  2. #
  3. #DO NOT EDIT THIS FILE
  4. #
  5. #It is automatically generated by grub-mkconfig using templates from /etc/grub.d and settings from /etc/default/grub
  6. #
  7. ### BEGIN /etc/grub.d/00_header ###
  8. if [ -s $prefix/grubenv ]; then
  9. set have_grubenv=true
  10. load_env
  11. fi
  12. set default="0"
  13. if [ "$ {prev_saved_entry}" ]; then
  14. set saved_entry="${prev_saved_entry}"
  15. save_env saved_entry
  16. set prev_saved_entry= save_env prev_saved_entry
  17. set boot_once=true
  18. fi
  19. function savedefault {
  20. if [ -z "${boot_once}" ]; then
  21. :

可以看到,less 在屏幕底部显示一个冒号 :,等待用户输入命令,比如说,用户想向下翻一页,可以按 空格键;如果想向上翻一页,可以按 b 键。

1.4 tail 命令:显示文件结尾的内容

1.4.1 语法格式

tail 命令和 head 命令正好相反,它用来查看文件末尾的数据,其基本格式如下:
**_[root@localhost ~]# tail [选项] 文件名_**
此命令常用的选项及含义如表 1 所示。

选项 含义
-n K 这里的 K 指的是行数,该选项表示输出最后 K 行,在此基础上,如果使用 -n +K,则表示从文件的第 K 行开始输出。
-c K 这里的 K 指的是字节数,该选项表示输出文件最后 K 个字节的内容,在此基础上,使用 -c +K 则表示从文件第 K 个字节开始输出。
-f 输出文件变化后新增加的数据。

表 1 tail 命令选项及含义

1.4.2 例子

例 1

查看 /etc/passwd 文件最后 3 行的数据内容。

  1. [root@localhost ~]# tail -n 3 /etc/passwd
  2. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  3. oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
  4. tcpdump:x:72:72::/:/sbin/nologin

除此之外,还可以采用如下这种形式:

  1. [root@localhost ~]# tail -3 /etc/passwd
  2. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  3. oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
  4. tcpdump:x:72:72::/:/sbin/nologin

可以看到,使用 tail -n 3 /etc/passwd 命令和 tail -3 /etc/passwd 的效果是一样的。

例 2

查看 /etc/passwd 文件末尾 100 个字节的数据内容。

  1. [root@localhost ~]# tail -c 100 /etc/passwd
  2. cpdump:x:72:72::/:/sbin/nologin

例 3

监听文件的新増内容。tail 命令有一种比较有趣的用法,可以使用 -f 选项来监听文件的新増内容,例如:

  1. [root@localhost ~]#tail -f anaconda-ks.cfg
  2. @server-platform
  3. @server-policy
  4. pax
  5. oddjob
  6. sgpio
  7. certmonger
  8. pam_krb5
  9. krb5-workstation
  10. perl-DBD-SQLite
  11. %end
  12. #光标不会退出文件,而会一直监听在文件的结尾处

这条命令会显示文件的最后 10 行内容,而且光标不会退出命令,每隔一秒会检查一下文件是否增加新的内容,如果增加就追加到原来的输出结果后面并显示。因此,这时如果向文件中追加一些数据(需要开启一个新终端):

  1. [root@localhost ~]# echo 2222222222 >> anaconda-ks.cfg
  2. [root@localhost ~]# echo 3333333333 >> anaconda-ks.cfg
  3. #在新终端中通过echo命令向文件中追加数据

那么,在原始的正在监听的终端中,会看到如下信息:

  1. [root@localhost ~]# tail -f anaconda-ks.cfg @server-platforin
  2. @server-policy
  3. pax
  4. oddjob
  5. sgpio
  6. certmonger
  7. pam_krb5
  8. krb5-workstation
  9. perl-DBD-SQLite
  10. %end2222222222
  11. 33333333333
  12. #在文件的结尾处监听到了新増数据

如果想终止输出,按 Ctrl+c 键中断 tail 命令即可。

1.5 grep 命令:查找文件内容

很多时候,我们并不需要列出文件的全部内容,而是从文件中找到包含指定信息的那些行,要实现这个目的,可以使用 grep 命令。
grep 命令作为 Linux 文本处理三剑客的一员,另外两个是 sed 和 awk,它们会在后续章节中作详细介绍。
grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的模式(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输出(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,而这也就是 grep 命令的全称。
grep 命令能够在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子。
正则表达式是描述一组字符串的一个模式,正则表达式的构成模仿了数学表达式,通过使用操作符将较小的表达式组合成一个新的表达式。正则表达式可以是一些纯文本文字,也可以是用来产生模式的一些特殊字符。为了进一步定义一个搜索模式,grep 命令支持如表 1 所示的这几种正则表达式的元字符(也就是通配符)。

通配符 功能
c* 将匹配 0 个(即空白)或多个字符 c(c 为任一字符)。
. 将匹配任何一个字符,且只能是一个字符。
[xyz] 匹配方括号中的任意一个字符。
[^xyz] 匹配除方括号中字符外的所有字符。
^ 锁定行的开头。
$ 锁定行的结尾。

表 1 cat 命令常用选项及含义
需要注意的是,在基本正则表达式中,如通配符 、+、{、|、( 和 )等,已经失去了它们原本的含义,而若要恢复它们原本的含义,则要在之前添加反斜杠 \,如 、+、{、|、( 和 )。
grep 命令是用来在每一个文件或中(或特定输出上)搜索特定的模式,当使用 grep 时,包含指定字符模式的每一行内容,都会被打印(显示)到屏幕上,但是使用 grep 命令并不改变文件中的内容。

1.5.1 语法格式

grep 命令的基本格式如下:
[root@localhost ~]# grep [选项] 模式 文件名
这里的模式,要么是字符(串),要么是正则表达式。而此命令常用的选项以及各自的含义如表 2 所示。

选项 含义
-c 仅列出文件中包含模式的行数。
-i 忽略模式中的字母大小写。
-l 列出带有匹配行的文件名。
-n 在每一行的最前面列出行号。
-v 列出没有匹配模式的行。
-w 把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行。

表 2 grep 命令常用选项及含义
注意,如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;而如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行。

1.5.2 例子

例 1

假设有一份 emp.data 员工清单,现在要搜索此文件,找出职位为 CLERK 的所有员工,则执行命令如下:
**_[root__@localhost__ ~]__# grep CLERK emp.data__ __#忽略输出内容_**
而在此基础上,如果只想知道职位为 CLERK 的员工的人数,可以使用 -c 选项,执行命令如下:
**_[root__@localhost__ ~]__# grep -c CLERK emp.data__ __#忽略输出内容_**

例 2

搜索 emp.data 文件,使用正则表达式找出以 78 开头的数据行,执行命令如下:
**_[root__@localhost__ ~]__# grep ^78 emp.data__ __#忽略输出内容_**
grep 命令的功能非常强大,通过利用它的不同选项以及变化万千的正则表达式,可以获取任何我们所需要的信息。本节所介绍的 grep 命令,只介绍了它的一部分基础知识,比如说,grep 命令可用的选项还有很多,且用法也五花八门,不过对于初学者来说,本节所介绍的内容已经足以应付多数 Linux 系统的日常工作了。

1.6 案例练习

2751 · 转换文件内容
2608 · 比较两个文件
2697 · 查找符合要求的文件(一)
2698 · 查找符合要求的文件(二)

第二章:Linux 文本处理

2.1 sed 命令:文本数据处理工具

sed 采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。

    2.1.1 语法格式

    sed 命令的基本格式如下:
    **_[root@localhost ~]# sed [选项] [脚本命令] 文件名_**
    该命令常用的选项及含义,如表 1 所示。
选项 含义
-e 脚本命令 该选项会将其后跟的脚本命令添加到已有的命令中。
-f 脚本命令文件 该选项会将其后文件中的脚本命令添加到已有的命令中。
-n 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
-i 此选项会直接修改源文件,要慎用。

表 1 sed 命令常用选项及含义
成功使用 sed 命令的关键在于掌握各式各样的脚本命令及格式,它能帮你定制编辑文件的规则。
动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

    2.1.2 例子

    例 1

    我们往 temp 文件的第 4 行后添加一行 “Hello world!” 并将结果输出到标准输出中
    1. [root@localhost ~]# cat temp
    2. HELLO LINUX!
    3. hello linux!
    4. jiuzhang
    5. lintcode
    6. linghuchong
    7. [root@localhost ~]# sed -e 4a\Hello world! temp
    8. HELLO LINUX!
    9. hello linux!
    10. jiuzhang
    11. lintcode
    12. Hello world!
    13. linghuchong

    2.2 awk 命令:文本数据处理工具

    除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linux 用户的原因之一。曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。
    和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。

    2.2.1 语法格式

    awk 命令的基本格式如下:
    **_[root@localhost ~]# awk [选项] '脚本命令' 文件名_**
    该命令常用的选项及含义,如表 1 所示。
选项 含义
-F fs 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
-f file 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。
-v var=val 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。

表 1 awk 命令选项以及含义
awk 的强大之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执行命令,如下所示:
**_'匹配规则__{执行命令}'_**
这里的 匹配规则,和 sed 命令中的 address 部分作用相同,用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正则表达式指定。另外需要注意的是,整个脚本命令是用单引号 ‘ ‘ 括起,而其中的执行命令部分需要用大括号 { } 括起来。
在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。

2.2.2 例子

**_[root@localhost ~]# awk '/^$/ {print "Blank line"}' test.txt_**
在此命令中,/^$/ 是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的文本进行输出。因此,整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。

2.2.3 awk 使用数据字段变量

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:

  • $0 代表整个文本行;
  • $1 代表文本行中的第 1 个数据字段;
  • $2 代表文本行中的第 2 个数据字段;
  • $n 代表文本行中的第 n 个数据字段。

前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每个数据字段都是通过字段分隔符划分的。awk 在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。
所以在下面的例子中,awk 程序读取文本文件,只显示第 1 个数据字段的值:

  1. [root@localhost ~]# cat data2.txt
  2. One line of test text.
  3. Two lines of test text.
  4. Three lines of test text.
  5. [root@localhost ~]# awk '{print $1}' data2.txt
  6. One
  7. Two
  8. Three

该程序用 $1 字段变量来表示“仅显示每行文本的第 1 个数据字段”。当然,如果你要读取采用了其他字段分隔符的文件,可以用 -F 选项手动指定。

2.2.4 awk 脚本命令使用多个命令

awk 允许将多条命令组合成一个正常的程序。要在命令行上的程序脚本中使用多条命令,只要在命令之间放个分号即可,例如:

  1. [root@localhost ~]# echo "My name is Rich" | awk '{$4="Christine"; print $0}'
  2. My name is Christine

第一条命令会给字段变量 $4 赋值。第二条命令会打印整个数据字段。可以看到,awk 程序在输出中已经将原文本中的第四个数据字段替换成了新值。
除此之外,也可以一次一行地输入程序脚本命令,比如说:

  1. [root@localhost ~]# awk '{
  2. > $4="Christine"
  3. > print $0}'
  4. My name is Rich
  5. My name is Christine

在你用了表示起始的单引号后,bash shell 会使用 > 来提示输入更多数据,我们可以每次在每行加一条命令,直到输入了结尾的单引号。
注意,此例中因为没有在命令行中指定文件名,awk 程序需要用户输入获得数据,因此当运行这个程序的时候,它会一直等着用户输入文本,此时如果要退出程序,只需按下 Ctrl+D 组合键即可。

2.2.5 awk从文件中读取程序

跟 sed 一样,awk 允许将脚本命令存储到文件中,然后再在命令行中引用,比如:

  1. [root@localhost ~]# cat awk.sh
  2. {print $1 "'s home directory is " $6}
  3. [root@localhost ~]# awk -F: -f awk.sh /etc/passwd
  4. root's home directory is /root
  5. bin's home directory is /bin
  6. daemon's home directory is /sbin
  7. adm's home directory is /var/adm
  8. lp's home directory is /var/spool/lpd
  9. ...
  10. Christine's home directory is /home/Christine
  11. Samantha's home directory is /home/Samantha
  12. Timothy's home directory is /home/Timothy

awk.sh 脚本文件会使用 print 命令打印 /etc/passwd 文件的主目录数据字段(字段变量 $6),以及 userid 数据字段(字段变量 $1)。注意,在程序文件中,也可以指定多条命令,只要一条命令放一行即可,之间不需要用分号。

2.2.6 awk BEGIN关键字

awk 中还可以指定脚本命令的运行时机。默认情况下,awk 会从输入中读取一行文本,然后针对该行的数据执行程序脚本,但有时可能需要在处理数据前运行一些脚本命令,这就需要使用 BEGIN 关键字。
BEGIN 会强制 awk 在读取数据前执行该关键字后指定的脚本命令,例如:

  1. [root@localhost ~]# cat data3.txt
  2. Line 1
  3. Line 2
  4. Line 3
  5. [root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
  6. > {print $0}' data3.txt
  7. The data3 File Contents:
  8. Line 1
  9. Line 2
  10. Line 3

可以看到,这里的脚本命令中分为 2 部分,BEGIN 部分的脚本指令会在 awk 命令处理数据前运行,而真正用来处理数据的是第二段脚本命令。

2.2.7 awk END关键字

和 BEGIN 关键字相对应,END 关键字允许我们指定一些脚本命令,awk 会在读完数据后执行它们,例如:

  1. [root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
  2. > {print $0}
  3. > END {print "End of File"}' data3.txt
  4. The data3 File Contents:
  5. Line 1
  6. Line 2
  7. Line 3
  8. End of File

可以看到,当 awk 程序打印完文件内容后,才会执行 END 中的脚本命令。

2.3 案例练习

2729 · 向文件写入内容
2730 · 删除文件内容
2733 · 以行为单位的文件内容替换与展示
2695 · 按不同分隔符取出文件指定项