- 发布日期
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 -m 与 wc -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`"
执行过程是:
- Shell 先执行反引号中的
pwd。 - 把
pwd的输出替换回原命令。 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) | 命令模式按 i、a、I、A、o 或 O | 正常输入和修改文本 |
| 底线命令模式(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;之后反复按 n 或 N 可以在匹配位置之间切换。
删除、复制、粘贴和撤销
| 按键 | 作用 |
|---|---|
dd | 删除当前光标所在行 |
ndd | 删除当前行及向下共 n 行,例如 3dd |
yy | 复制当前行 |
nyy | 复制当前行及向下共 n 行,例如 2yy |
p | 粘贴已复制或删除的内容 |
u | 撤销上一次修改 |
Ctrl+r | 反向撤销,也就是重做被 u 撤销的修改 |
按范围删除
| 按键 | 作用 |
|---|---|
dG | 从当前行开始删除到文件末尾 |
dgg | 从当前行开始删除到文件开头 |
d$ | 从当前光标位置删除到当前行行尾 |
d0 | 从当前光标位置删除到当前行行首 |
这些删除命令立即生效,但可以先用 u 撤销。进行大范围删除前,最好先通过 gg、G、0、$ 确认光标确实处于预期位置。
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
写入并观察文件变化
需要执行破坏性命令时,先用 pwd 和 ls 确认目标;遇到未知选项时,先用 --help 或 man 查询。这两个习惯比多记几个命令更重要。