缘博客
发布日期

Linux基础命令(三):文本处理、重定向与Vim

作者
  • 姓名
    社交账号

本篇学习范围

前两篇已经能在 Linux 中定位目录、创建和查找文件。本篇继续处理文件中的文本内容,并学习终端最重要的两种组合能力:

筛选或统计文本
用管道把一个命令的结果交给另一个命令
把输出覆盖或追加到文件
用 tail 观察文件末尾的新增内容
用 Vim 编辑文件本身

课后练习不单独展开,但课件涉及的操作命令、选项和快捷键都会保留在本文中。


grep:按关键字筛选文本行

grep 从文本中筛选包含指定关键字的行。基本语法:

grep [-n] "关键字" 文件路径

其中:

部分含义
-n可选,在输出结果前显示匹配行的行号
"关键字"必填,要匹配的文本;带空格或特殊字符时建议加引号
文件路径必填,要筛选内容的文件;也可以改由管道提供输入

示例:

# 输出 app.log 中包含 error 的行
grep "error" app.log

# 输出并显示行号
grep -n "error" app.log

# 关键字带空格时必须作为一个整体传入
grep "login failed" app.log

grep 每次输出的是匹配到的整行,而不是只输出关键字本身。若一行中多次出现关键字,默认也只会把这一行输出一次。

在本课件的范围内,先把它理解成“文件内容过滤器”即可;下一节会通过管道让它处理其他命令的输出。


wc:统计行、单词、字符和字节

wc 用于做数量统计:

wc [选项] 文件路径

不带选项时,wc 会同时给出行数、单词数和字节数:

wc app.log

常用选项:

选项统计对象
-c字节数(bytes)
-m字符数
-l行数
-w单词数

例如:

wc -l app.log
wc -w app.log
wc -c app.log
wc -m app.log

需要区分字符数和字节数。ASCII 英文字符通常占一个字节,而 UTF-8 编码下的中文字符通常占多个字节,因此 wc -mwc -c 的结果可能不同。

文件路径不是 wc 唯一的输入来源。它也可以接收管道左侧传来的内容,例如 grep "error" app.log | wc -l


管道符 |:连接多个命令

管道符写作 |,它会把左侧命令的输出,作为右侧命令的输入:

左侧命令 | 右侧命令

例如:

cat app.log | grep "error"

运行过程可以理解为:

cat app.log 输出文件内容
grep "error" 接收这些内容并筛选

更常见的写法是不使用多余的 cat,直接把文件交给 grep

grep "error" app.log

但管道真正的价值在于连接不同命令:

# 在当前目录列表中筛选包含 Desktop 的条目
ls | grep "Desktop"

# 在 find 的结果中只保留路径包含 /usr/lib64 的项
find / -name "test" | grep "/usr/lib64"

# 连续筛选:先找 itcast,再在结果中找 itheima
cat itheima.txt | grep "itcast" | grep "itheima"

# 统计文件中包含 itcast 的行数
grep "itcast" test.txt | wc -l

# 统计包含 itheima 的行中有多少个单词
grep "itheima" test.txt | wc -w

一条很长的管道难以调试。写复杂命令时,先单独运行最左边的命令,确认输出正确,再逐段往右加。


echo:向终端输出文本

echo 用于在终端输出内容:

echo "要输出的内容"

例如:

echo "Hello Linux"
echo "当前用户正在练习 Shell"

echo 本身只有一个表示输出内容的参数。内容含空格、反斜杠或其他特殊字符时,建议使用双引号包住:

echo "Hello Linux and Shell"

不加引号时,Shell 往往会把空格分隔的内容视为多个参数。对于 echo 来说,很多简单情况仍会显示出来,但养成加引号的习惯可以避免命令在更复杂场景中产生歧义。


命令替换:反引号和 $(...)

如果直接输入:

echo pwd

终端会输出文字 pwd,因为它被当作普通参数。课件中使用反引号把命令包起来,使其中内容先执行:

echo "当前工作目录是:`pwd`"

执行过程是:

  1. Shell 先执行反引号中的 pwd
  2. pwd 的输出替换回原命令。
  3. echo 输出完整文本。

现代 Shell 脚本更推荐等价的 $(...) 形式,因为可读性更好,也能嵌套:

echo "当前工作目录是:$(pwd)"

两种写法都属于命令替换。阅读旧脚本时会经常看到反引号,编写新脚本时优先使用 $(...)


重定向:把输出写入文件

重定向符可以改变命令输出的去向。

>:覆盖写入

echo "Hello Linux" > itheima.txt

> 会把左侧命令的输出写入右侧文件。若文件不存在会创建;若文件已存在,会先清空旧内容再写入新内容。

echo "第一行" > work.txt
echo "新内容" > work.txt

第二条命令执行后,work.txt 中只保留“新内容”。

>>:追加写入

echo "Hello itcast" >> itheima.txt

>> 同样会在文件不存在时创建它,但文件已存在时会保留已有内容,并在末尾新增一行输出:

echo "第一行" > work.txt
echo "第二行" >> work.txt

此时 work.txt 同时含有两行内容。

符号文件不存在时文件已存在时
>创建并写入覆盖原有内容
>>创建并写入在末尾追加内容

重定向前务必确认右侧文件名。> 不会询问你是否真的要覆盖旧内容。


tail:查看尾部并持续跟踪变化

tail 用于查看文件尾部内容,也可持续观察文件是否追加了新内容:

tail [选项] 文件路径

不加选项时默认显示最后 10 行:

tail /var/log/vmware-network.log

常用选项:

选项作用
-n 数字显示最后指定行数
-f持续跟踪文件的新内容

例如:

# 查看最后 3 行
tail -n 3 /var/log/vmware-network.log

# GNU tail 也常接受这种简写
tail -3 /var/log/vmware-network.log

# 持续跟踪文件,按 Ctrl+C 停止
tail -f test.txt

tail -f 常用于观察应用日志。一个终端运行:

tail -f work.txt

另一个终端追加内容:

echo "新增一行" >> work.txt

第一个终端会立刻显示新增文本。这也说明了 >>tail -f 的配合关系:前者负责追加,后者负责观察新增。


Vim:命令行中的文本编辑器

vi 是 Linux 中经典的命令行文本编辑器,名称通常解释为 visual editor。vim 是它的增强版本,兼容 vi 的常用操作,并提供语法高亮等能力。

打开或创建文件:

vim 文件路径

例如:

vim hello.txt
vim ~/linux-practice/notes.txt

若路径对应文件不存在,Vim 会打开一个新缓冲区,保存时创建该文件;若文件存在,则编辑现有内容。

Vim 的三种模式

Vim 的按键含义由当前模式决定:

模式如何进入主要用途
命令模式(Command mode)打开 Vim 后默认进入,或按 Esc 返回移动光标、删除、复制、搜索等
输入模式(Insert mode)命令模式按 iaIAoO正常输入和修改文本
底线命令模式(Last line mode)命令模式按 :保存、退出和设置选项

最小编辑流程:

vim hello.txt
默认处于命令模式
按 i,进入输入模式
输入文本
按 Esc,回到命令模式
按 :,进入底线命令模式
输入 wq,再按 Enter,保存并退出

进入输入模式的快捷键

输入模式中可以正常键入文本;下面的按键用于从命令模式进入输入模式,区别在于插入位置:

按键进入输入模式的位置
i当前光标位置
a当前光标之后
I当前行行首
A当前行行尾
o在当前行下方新建一行
O在当前行上方新建一行

编辑完成后按 Esc 返回命令模式,之后才能使用移动、搜索、保存和退出等命令。


Vim 命令模式快捷键

打开 Vim 后默认就是命令模式。下面按“移动、搜索、修改”分类整理课件中的快捷键。

移动光标和翻页

按键作用
k光标向上移动
j光标向下移动
h光标向左移动
l光标向右移动
0移动到当前行行首
$移动到当前行行尾
gg跳转到文件首行
G跳转到文件末行
PageUp向上翻页
PageDown向下翻页

搜索

按键作用
/进入搜索模式,输入关键字后按 Enter 搜索
n跳到下一个匹配结果
N跳到上一个匹配结果

例如,在命令模式输入 /error 并按 Enter,Vim 会搜索 error;之后反复按 nN 可以在匹配位置之间切换。

删除、复制、粘贴和撤销

按键作用
dd删除当前光标所在行
ndd删除当前行及向下共 n 行,例如 3dd
yy复制当前行
nyy复制当前行及向下共 n 行,例如 2yy
p粘贴已复制或删除的内容
u撤销上一次修改
Ctrl+r反向撤销,也就是重做被 u 撤销的修改

按范围删除

按键作用
dG从当前行开始删除到文件末尾
dgg从当前行开始删除到文件开头
d$从当前光标位置删除到当前行行尾
d0从当前光标位置删除到当前行行首

这些删除命令立即生效,但可以先用 u 撤销。进行大范围删除前,最好先通过 ggG0$ 确认光标确实处于预期位置。


Vim 底线命令模式

在命令模式按 : 后,光标会出现在底部,接着输入完整命令并按 Enter。

命令作用
:wq保存并退出
:q退出;若有未保存修改,Vim 会阻止退出
:q!放弃未保存修改,强制退出
:w只保存,不退出
:set nu显示行号
:set paste开启粘贴模式,减少粘贴多行内容时的缩进干扰

如果只是想保存并结束编辑,记住 Esc:wq 就能完成最常见任务。若误进入编辑或发现改错内容,先按 Esc,再使用 :q! 放弃本次未保存的修改。


命令选项和帮助文档

Linux 命令的选项远多于入门阶段需要记忆的部分。比如 ls 还有许多未在课程中逐一展开的选项。遇到陌生命令或不确定参数时,不要猜,优先查帮助。

--help:快速查看说明

大多数命令支持 --help

ls --help
grep --help
find --help

它会输出简明的用法、常见选项和说明,适合快速确认参数。

man:查看完整手册

man 来自 manual,用于打开命令的详细手册:

man ls
man find

课件中也列出 man cd。但 cd 常是 Shell 内建命令,某些系统没有对应的 man 页面;在 Bash 中可以改用:

help cd

手册页多数为英文。打开后可以翻页浏览,按 q 退出。若需要保存内容进一步阅读,可以把输出重定向到文本文件:

man ls > ls-man.txt

命令手册会随着系统版本更新,因此它通常比零散的网络截图更适合作为当前环境的参数依据。


系列收束:从命令到操作习惯

三篇文章中的命令可以串成一套日常终端操作流程:

pwd / cd / ls
  确认位置并定位目录
mkdir / touch / vim
  创建并编辑内容
cat / more / grep / wc
  查看、筛选和统计文本
cp / mv / find
  整理和定位文件
echo / > / >> / tail -f
  写入并观察文件变化

需要执行破坏性命令时,先用 pwdls 确认目标;遇到未知选项时,先用 --helpman 查询。这两个习惯比多记几个命令更重要。

上一节:Linux基础命令(二):文件操作与查找命令