文本处理
文本处理是Linux系统中最基础也是最常用的操作之一。无论是查看配置文件、分析日志数据,还是处理程序输出,都离不开文本处理工具。Linux提供了丰富的文本处理命令,这些命令可以帮助用户高效地完成各种文本操作。
echo - 显示文本或变量内容
命令简介
echo是Linux中最基础且最常用的命令之一,用于在终端输出文本或变量内容。它支持转义字符和格式化输出,常用于脚本编写、变量调试和简单信息显示。
语法格式
echo [选项] [字符串/变量]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-n | 不输出结尾的换行符 | echo -n "Hello" |
-e | 启用反斜杠转义解释 | echo -e "Line1\nLine2" |
-E | 禁用反斜杠转义(默认) | echo -E "Text\t" |
--help | 显示帮助信息 | echo --help |
--version | 显示版本信息 | echo --version |
转义字符(需配合-e使用)
| 转义符 | 描述 |
|---|---|
\n | 换行 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠 |
\b | 退格 |
\a | 警报声 |
\r | 回车 |
经典案例
# 基本文本输出
echo "Hello World"
# 输出变量内容
name="Alice"
echo "Welcome $name"
# 不换行输出
echo -n "Current time: "
date
# 使用转义字符
echo -e "First line\nSecond line"
# 输出特殊格式
echo -e "Column1\tColumn2\tColumn3"
# 输出到文件
echo "Log entry" >> log.txt
# 显示命令执行结果
echo "Today is $(date)"
# 输出带颜色的文本
echo -e "\033[31mError message\033[0m"注意事项
- 变量引用时建议用双引号包裹,可以解析变量和转义字符
- 单引号会原样输出内容,不解析任何特殊字符
- 在脚本中使用时,建议明确使用
-e或-E以避免不同系统的行为差异 - 输出包含特殊字符时,建议使用转义或引号包裹
- 不同shell的echo行为可能略有不同,bash内置echo通常功能最全
- 对于复杂格式化输出,printf命令可能更合适
cat - 文件内容查看与合并工具
命令简介
cat(concatenate的缩写)是Linux中最常用的文件操作命令之一,主要用于查看文件内容、创建文件、合并文件以及将文件内容重定向到其他文件或设备。虽然功能简单,但在日常文件操作和脚本编写中不可或缺。
语法格式
cat [选项] [文件...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-n | 显示行号(包括空行) | cat -n file.txt |
-b | 显示行号(忽略空行) | cat -b file.txt |
-s | 压缩连续空行为一行 | cat -s file.txt |
-E | 在每行结尾显示$符号 | cat -E file.txt |
-T | 将制表符显示为^I | cat -T file.txt |
-A | 相当于-vET组合 | cat -A file.txt |
--help | 显示帮助信息 | cat --help |
--version | 显示版本信息 | cat --version |
经典案例
# 查看单个文件内容
cat file.txt
# 查看多个文件内容
cat file1.txt file2.txt
# 显示行号查看文件
cat -n /etc/passwd
# 创建新文件(Ctrl+D保存退出)
cat > newfile.txt
# 追加内容到文件
cat >> existing.txt
# 合并多个文件
cat part1.txt part2.txt > complete.txt
# 显示不可见字符
cat -A script.sh
# 清空文件内容
cat /dev/null > logfile.log
# 将键盘输入显示到屏幕
cat -
# 与管道配合使用
cat access.log | grep "404"注意事项
- 不适合查看大文件(建议使用
less或more) - 合并文件时会保留原文件中的空行
- 使用重定向时要小心,
>会覆盖目标文件 - 二进制文件使用
cat查看可能导致终端混乱 - 在脚本中使用时,建议检查文件是否存在
- 某些系统可能有
tac命令(反向显示文件内容)
more - 分页显示文件内容
命令简介
more 是一个经典的分页显示工具,用于逐页查看文件内容。相比 cat 命令,more 更适合查看大文件,支持向前翻页但无法向后回翻(这是 less 命令的优势)。
语法格式
more [选项] 文件名选项
| 选项 | 描述 | 示例 |
|---|---|---|
-d | 显示帮助提示(按空格继续,'q'退出) | more -d large.log |
-f | 强制统计逻辑行而非屏幕行 | more -f data.txt |
-l | 不处理换页符(^L) | more -l code.c |
-p | 不滚屏,清屏后显示 | more -p config.txt |
-c | 不滚屏,从上到下显示 | more -c output.log |
-s | 压缩连续空行为一行 | more -s document.txt |
-u | 不显示下划线 | more -u README |
-num | 指定每屏显示行数 | more -10 access.log |
交互命令
| 命令 | 功能 |
|---|---|
空格 | 向下翻一页 |
Enter | 向下翻一行 |
= | 显示当前行号 |
:f | 显示文件名和当前行号 |
q | 退出 |
/字符串 | 搜索指定字符串 |
n | 查找下一个匹配项 |
h | 显示帮助 |
经典案例
# 基本分页查看
more /var/log/syslog
# 每屏显示15行
more -15 longfile.txt
# 查看压缩后的输出(合并空行)
more -s output.txt
# 结合管道使用
ps aux | more
# 显示行号并分页
cat -n bigfile.txt | more
# 搜索特定内容
more +/error logfile.log注意事项
- 相比
less命令功能有限,不支持向后翻页 - 适合快速查看,复杂导航建议使用
less - 二进制文件可能导致显示混乱
- 某些版本支持
+n从第n行开始显示 - 在脚本中使用时可能不如
less灵活
less - 高级文件查看工具
命令简介
less 是Linux中最强大的文件查看工具,相比 more 提供了更丰富的功能,支持前后翻页、搜索、标记位置等高级特性。它不会一次性加载整个文件,因此特别适合查看大文件。
语法格式
less [选项] 文件名常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-N | 显示行号 | less -N file.txt |
-i | 忽略搜索时的大小写 | less -i log.txt |
-F | 文件小于一屏时自动退出 | less -F short.txt |
-S | 截断长行不换行 | less -S data.csv |
-X | 退出时不清屏 | less -X notes.txt |
+/pattern | 打开时定位到第一个匹配处 | less +/error log.txt |
-M | 显示更详细的状态信息 | less -M document.txt |
-R | 正确显示ANSI颜色代码 | less -R colored.log |
交互命令
| 命令 | 功能 |
|---|---|
空格 或 f | 向下翻一页 |
b | 向上翻一页 |
d/u | 向下/上半页 |
Enter 或 e | 向下移动一行 |
y 或 k | 向上移动一行 |
g | 跳到文件开头 |
G | 跳到文件末尾 |
50g | 跳到第50行 |
/pattern | 向前搜索 |
?pattern | 向后搜索 |
n | 重复上一次搜索 |
N | 反向重复搜索 |
v | 进入编辑器模式 |
h | 显示帮助 |
q | 退出 |
经典案例
# 基本查看文件
less /var/log/syslog
# 查看并显示行号
less -N /etc/nginx/nginx.conf
# 搜索特定内容(打开时定位到第一个"error")
less +/error /var/log/syslog
# 查看命令输出
ps aux | less
# 查看压缩文件内容
zless access.log.gz
# 保留颜色输出
grep --color=always "ERROR" log.txt | less -R
# 横向滚动查看宽文件
less -S wide_data.csv
# 查看多个文件
less file1.txt file2.txt
# 使用 `:n` 查看下一个文件,`:p` 查看上一个文件
# 标记位置
# 按 `m` 加标记字母(如a),然后按 `'a` 返回标记处
# 同时监控文件变化
less +F growing_log.log
# 按 Ctrl+C 停止监控,再按 F 恢复监控注意事项
less不会修改原始文件- 支持直接查看压缩文件(通过
zless) - 可以查看命令管道输出
- 搜索时支持正则表达式
- 退出后保留屏幕显示(除非使用
-X选项) - 比
more更节省内存,适合大文件
less 是Linux系统管理员和开发者的必备工具,掌握它的使用可以极大提高工作效率。
head - 查看文件头部内容
显示文件的前 N 行(默认 10 行),常用于快速预览文件。
语法格式
head [选项] 文件选项
| 选项 | 作用 | 示例 |
|---|---|---|
-n NUM | 显示前 NUM 行 | head -n 5 file.log |
-c NUM | 显示前 NUM 字节 | head -c 100 file.bin |
-q | 不显示文件名(多文件时) | head -q file1 file2 |
-v | 始终显示文件名 | head -v file1 → ==> file1 <== ... |
经典案例
# 查看前 5 行配置文件
head -n 5 /etc/nginx/nginx.conf
# 查看前 100 字节(适合二进制文件预览)
head -c 100 image.jpg
# 结合管道处理其他命令的输出
ps aux | head -n 5 # 显示前 5 个进程
seq 100 | head -n 20 # 显示 1-20 的序列tail - 查看文件尾部内容
显示文件的最后 N 行(默认 10 行),常用于日志监控。
语法格式
tail [选项] 文件选项
| 选项 | 作用 | 示例 |
|---|---|---|
-n NUM | 显示最后 NUM 行 | tail -n 20 file.log |
-c NUM | 显示最后 NUM 字节 | tail -c 500 file.log |
-f | 实时追踪文件更新 | tail -f /var/log/nginx/access.log |
-F | 类似 -f,但文件被轮转后自动重新打开 | tail -F app.log |
-q | 不显示文件名(多文件时) | tail -q file1 file2 |
经典案例
# 查看日志最后 50 行
tail -n 50 /var/log/syslog
# 实时监控日志新增内容(调试必备)
tail -f /var/log/nginx/access.log
# 持续追踪日志(即使日志文件被轮转)
tail -F /var/log/app/app.log
# 查看文件末尾 1KB 内容
tail -c 1024 large_file.bin
# 结合 grep 过滤实时日志
tail -f app.log | grep "ERROR"cut - 文本列提取工具
命令简介
cut 是一个高效的文本列提取工具,能够按字段、字符位置或分隔符从文本行中提取特定部分。特别适合处理结构化文本数据(如CSV、日志等)。
语法格式
cut [选项] [文件]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-b bytes | 按字节位置提取 | cut -b 1-5,10-15 file.txt |
-c chars | 按字符位置提取 | cut -c 1-20 file.txt |
-f fields | 按字段提取(需指定分隔符) | cut -f 1,3 -d',' data.csv |
-d delim | 指定字段分隔符(默认TAB) | cut -d':' -f1 /etc/passwd |
--complement | 反选(显示未被选中的部分) | cut -f2 --complement data.txt |
-s | 不显示无分隔符的行 | cut -s -d':' -f1 file.txt |
--output-delimiter | 指定输出分隔符 | cut -d',' -f1-3 --output-delimiter='|' data.csv |
经典案例
# 提取/etc/passwd的用户名(第一字段)
cut -d':' -f1 /etc/passwd
# 提取CSV文件前3列(逗号分隔)
cut -d',' -f1-3 data.csv
# 提取每行前10个字符
cut -c1-10 long_text.txt
# 提取多个不连续字段(第2和第4列)
cut -d' ' -f2,4 logfile.txt
# 提取时修改输出分隔符为竖线
cut -d',' -f1-3 --output-delimiter='|' data.csv
# 结合其他命令使用(提取进程PID)
ps aux | cut -d' ' -f2
# 反选排除第3列
cut -f3 --complement table.txt
# 处理固定宽度数据(提取第5-9字符)
cut -c5-9 fixed_width.dat
# 提取最后一个字段(需要结合rev命令)
rev file.txt | cut -d' ' -f1 | rev
# 处理含空格的日志行(先规范分隔符)
sed 's/ */ /g' log.txt | cut -d' ' -f3
# 提取两个标记之间的内容
cut -d'[' -f2 | cut -d']' -f1注意事项
- 分隔符只能是一个字符(不支持多字符分隔符)
- 处理空格分隔文件时建议先用
tr压缩空格:tr -s ' ' < file.txt | cut -d' ' -f2 - 字段编号从1开始(不是0)
- 包含中文等多字节字符时建议用
-c而非-b - 空字段会保留(使用
-s可过滤无分隔符的行) - 比
awk更轻量但功能有限,复杂场景建议用awk
cut 是处理列式数据的利器,在日志分析、数据提取等场景中能极大提高效率。掌握它与grep、sort等命令的组合使用,可以解决大多数文本处理需求。
tac - 反向显示文件内容
命令简介
tac 是 cat 命令的反向版本,用于将文件内容按行逆序显示(从最后一行到第一行)。名称来源于 "cat" 的反向拼写。特别适合查看日志文件时从最新内容开始阅读。
语法格式
tac [选项] [文件...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-b | 在行前而非行后添加分隔符 | tac -b file.log |
-r | 将分隔符视为正则表达式 | tac -r sep.txt |
-s | 使用指定字符串作为分隔符(默认换行符) | tac -s "###" notes.txt |
--help | 显示帮助信息 | tac --help |
--version | 显示版本信息 | tac --version |
经典案例
# 基本反向显示文件
tac /var/log/syslog
# 多个文件反向合并显示
tac file1.txt file2.txt
# 使用自定义分隔符(按段落反向)
tac -s "###" document.txt
# 结合管道使用(先过滤再反向)
grep "ERROR" app.log | tac
# 查看最新10条日志
tac /var/log/nginx/access.log | head -n 10
# 反向显示并保留行号
cat -n message.log | tac
# 按空行分段反向显示
tac -s "^$" report.txt注意事项
- 大文件处理时性能优于人工逆序操作
- 默认按行处理,但可通过
-s指定其他分隔方式 - 二进制文件可能导致输出混乱
- 某些系统可能需要安装
coreutils包 - 与
tail -r功能类似,但tac更通用
tac 在处理日志分析、时间序列数据等需要从新到旧查看的场景中非常实用,是系统管理员和开发者的有力工具。
wc - 文件统计
统计文件的行数、单词数、字节数或字符数
语法格式
wc [选项] [文件...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-l | 仅统计行数 | wc -l file.txt |
-w | 仅统计单词数 | wc -w file.txt |
-c | 仅统计字符数 | wc -c file.txt |
-m | 统计字符数(多字节字符按实际计算) | wc -m file.txt |
-L | 显示最长行的长度 | wc -L file.txt |
--help | 显示帮助信息 | wc --help |
--version | 显示版本信息 | wc --version |
经典案例
wc file.txt # 统计文件的行数、单词数、字节数(默认)
wc -l access.log # 仅统计文件行数
wc -w file1.txt file2.txt # 统计多个文件的总单词数
wc -l *.txt # 统计当前目录下所有 .txt 文件的行数
ls | wc -l # 结合管道统计命令输出的行数
wc -L script.sh # 统计最长行的长度(字节数)注意事项:
- 单词(
-w)的定义:以空格、制表符或换行符分隔的字符串。 - 字符(
-m) vs 字节(-c):- 在ASCII文件中,
-c和-m结果相同。 - 在UTF-8等多字节编码文件中,
-m统计实际字符数(如中文),-c统计字节数。
- 在ASCII文件中,
diff - 文件差异比较工具
命令简介
diff 用于比较两个文件或目录的差异,是代码审查、配置管理和文件同步的核心工具。
语法格式
diff [选项] 文件1 文件2常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-u | 生成统一格式差异 | diff -u v1.c v2.c |
-c | 上下文格式输出 | diff -c old.conf new.conf |
-r | 递归比较目录 | diff -r dir1 dir2 |
-i | 忽略大小写 | diff -i file1 file2 |
-w | 忽略空白差异 | diff -w code1.py code2.py |
-q | 仅显示是否不同 | diff -q backup live |
-y | 并排显示差异 | diff -y left.txt right.txt |
经典案例
# 生成补丁文件
diff -Naur old.c new.c > patch.diff
# 比较目录结构
diff -rq /etc/ /etc_backup/
# 忽略空白变化
diff -w original modified
# 并排显示彩色差异
diff -y --color file1 file2
# 比较压缩文件
zdiff log1.gz log2.gzsort - 文本排序工具
命令简介
sort 对文本行进行排序,支持多字段、多规则排序,是数据处理流水线的核心命令。
语法格式
sort [选项] [文件]常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-n | 按数值排序 | sort -n data.txt |
-r | 逆序排序 | sort -r names.txt |
-k | 指定排序列 | sort -k2,2n data.csv |
-t | 指定分隔符 | sort -t':' -k3n /etc/passwd |
-u | 去重排序 | sort -u words.txt |
-f | 忽略大小写 | sort -f dictionary.txt |
-h | 人类可读数字排序 | sort -h sizes.txt |
经典案例
# 多字段排序(先第3列数字,再第1列逆序)
sort -k3,3n -k1,1r data.txt
# 处理CSV文件(按第4列IP地址排序)
sort -t',' -k4V data.csv
# 合并多个有序文件
sort -m file1 file2 file3
# 内存限制排序(大文件处理)
sort --buffer-size=1G huge.log
# 检查文件是否已排序
sort -c checklist.txtuniq - 相邻行去重工具
命令简介
uniq 用于过滤相邻重复行,常与 sort 配合使用进行全局去重统计。
语法格式
uniq [选项] [输入文件 [输出文件]]常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-c | 统计出现次数 | uniq -c log.txt |
-d | 仅显示重复行 | uniq -d data.txt |
-u | 仅显示唯一行 | uniq -u records.txt |
-i | 忽略大小写 | uniq -i words.txt |
-f N | 跳过前N个字段比较 | uniq -f2 configs.txt |
-s N | 跳过前N个字符比较 | uniq -s10 hashes.txt |
经典案例
# 统计日志错误类型频率
grep "ERROR" app.log | sort | uniq -c | sort -nr
# 找出重复的配置文件项
sort config.ini | uniq -d
# 提取唯一IP地址
awk '{print $1}' access.log | sort -u
# 比较跳过时间戳的日志行
uniq -s26 timed_log.txt
# 检查连续重复命令历史
history | uniq -c | grep -v "^ *1"这些文本处理工具的组合使用可以解决日志分析、数据清洗、系统审计等复杂任务,是Linux系统管理的必备技能。
