三、文件内容查看与处理
3.1 cat - 查看完整文件
cat file.txt # 输出整个文件
cat file1.txt file2.txt # 合并输出多个文件
cat -n file.txt # 显示行号
cat -b file.txt # 显示非空行行号
cat -s file.txt # 压缩连续空行为一行
# 快速创建文件
cat > newfile.txt
输入内容...
按 Ctrl+D 保存
# 合并文件
cat header.html content.html footer.html > full.html
3.2 less/more - 分页查看
less file.txt # 分页查看(推荐,功能更强)
more file.txt # 分页查看(较老)
# less 快捷键
Space / f # 下一页
b # 上一页
/pattern # 向下搜索 pattern
?pattern # 向上搜索 pattern
n # 下一个匹配
N # 上一个匹配
g # 跳转到文件开头
G # 跳转到文件结尾
q # 退出
3.3 head/tail - 查看开头/结尾
head file.txt # 前10行
head -20 file.txt # 前20行
head -n 20 file.txt # 同上
tail file.txt # 后10行
tail -20 file.txt # 后20行
tail -f log.txt # 实时跟踪文件变化(日志监控最常用)
tail -f -n 100 app.log # 显示最后100行并持续跟踪
# 显示中间部分
head -50 file.txt | tail -20 # 显示 31-50 行
3.4 grep - 搜索文本
# 基础搜索
grep "error" log.txt # 搜索包含 error 的行
grep -i "error" log.txt # 忽略大小写
grep -r "TODO" ./src # 递归搜索目录
grep -n "error" log.txt # 显示行号
grep -v "debug" log.txt # 反向搜索(不包含 debug 的行)
# 正则表达式
grep "^ERROR" log.txt # 以 ERROR 开头的行
grep "ERROR$" log.txt # 以 ERROR 结尾的行
grep "[0-9]\+" log.txt # 包含数字的行
grep -E "error|warning" log.txt # 多个关键词(扩展正则)
egrep "error|warning" log.txt # 等价于 grep -E
# 上下文
grep -A 3 "error" log.txt # 显示匹配行及其后3行
grep -B 2 "error" log.txt # 显示匹配行及其前2行
grep -C 5 "error" log.txt # 显示匹配行及其前后5行
# 统计与过滤
grep -c "error" log.txt # 统计匹配行数
grep -l "error" *.log # 只显示包含匹配的文件名
grep -L "error" *.log # 只显示不包含匹配的文件名
# 实际案例
# 查找所有未使用的函数调用
grep -r "oldFunction" --include="*.js" --exclude-dir=node_modules ./
# 查看除注释外的配置行
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
3.5 sed - 流编辑器
# 替换文本
sed 's/old/new/' file.txt # 替换每行第一个 old
sed 's/old/new/g' file.txt # 替换所有 old
sed 's/old/new/2' file.txt # 替换每行第二个 old
sed 's/old/new/gi' file.txt # 忽略大小写
# 指定行操作
sed '3s/old/new/' file.txt # 只替换第3行
sed '3,6s/old/new/g' file.txt # 替换3-6行
sed '/pattern/s/old/new/g' file # 匹配 pattern 的行才替换
# 删除行
sed '3d' file.txt # 删除第3行
sed '3,6d' file.txt # 删除3-6行
sed '/^$/d' file.txt # 删除空行
sed '/pattern/d' file.txt # 删除匹配的行
# 插入/追加
sed '3i\新行内容' file.txt # 在第3行前插入
sed '3a\新行内容' file.txt # 在第3行后追加
# 原地修改(直接修改文件)
sed -i 's/old/new/g' file.txt
sed -i.bak 's/old/new/g' file.txt # 备份原文件
# 实际案例
# 批量替换配置文件中的端口
sed -i 's/port=8080/port=3000/g' config.properties
# 删除 HTML 标签
sed 's/<[^>]*>//g' index.html
3.6 awk - 文本处理语言
# 基础结构:awk '{pattern + action}' file
# 打印列
awk '{print $1}' file.txt # 打印第1列
awk '{print $1, $3}' file.txt # 打印第1、3列
awk '{print NF}' file.txt # 打印每行列数
awk '{print $NF}' file.txt # 打印最后一列
# 指定分隔符
awk -F',' '{print $1}' data.csv # CSV 文件,逗号分隔
awk -F':' '{print $1}' /etc/passwd
# 条件过滤
awk '/error/ {print $0}' log.txt # 匹配 error 的行
awk '$3 > 100 {print $0}' data.txt # 第3列大于100
awk 'NR>=10 && NR<=20' file.txt # 第10-20行
# 内置变量
NR # 当前行号
NF # 当前行的字段数
$0 # 整行内容
$1 # 第1个字段
# 计算
awk '{sum+=$1} END {print sum}' numbers.txt # 求和
awk '{sum+=$1} END {print sum/NR}' numbers.txt # 平均值
awk '{count[$1]++} END {for(i in count) print i, count[i]}' log.txt # 统计频率
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' data.txt
# 实际案例
# 统计访问日志中每个 IP 的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 找出 CPU 使用率超过 80% 的进程
ps aux | awk '$3 > 80 {print $2, $11}'
3.7 vim - 终端编辑器
# 三种模式
- 普通模式:浏览代码,执行命令
- 插入模式:输入文本
- 命令模式:执行保存、退出等操作
# 进入/退出
vim file.txt # 打开文件
:w # 保存
:q # 退出
:wq # 保存并退出
:q! # 强制退出(不保存)
# 移动(普通模式)
h/j/k/l # 左/下/上/右
w # 下一个单词开头
b # 上一个单词开头
0 # 行首
$ # 行尾
gg # 文件开头
G # 文件结尾
Ctrl+f / Ctrl+b # 下/上翻页
# 编辑
i # 在光标前插入
a # 在光标后插入
o # 在下方新行插入
dd # 删除当前行
yy # 复制当前行
p # 粘贴
u # 撤销
Ctrl+r # 重做
# 搜索
/pattern # 向下搜索
?pattern # 向上搜索
n # 下一个匹配
N # 上一个匹配
# 替换
:%s/old/new/g # 全局替换
:3,6s/old/new/g # 3-6行替换
# 配置 ~/.vimrc
set number # 显示行号
set tabstop=2 # Tab 宽度2空格
set expandtab # Tab 转空格
set syntax=on # 语法高亮