Skip to content

文本处理

文本处理是Linux系统中最基础也是最常用的操作之一。无论是查看配置文件、分析日志数据,还是处理程序输出,都离不开文本处理工具。Linux提供了丰富的文本处理命令,这些命令可以帮助用户高效地完成各种文本操作。

echo - 显示文本或变量内容

命令简介

echo是Linux中最基础且最常用的命令之一,用于在终端输出文本或变量内容。它支持转义字符和格式化输出,常用于脚本编写、变量调试和简单信息显示。

语法格式

bash
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回车

经典案例

bash
# 基本文本输出
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"

注意事项

  1. 变量引用时建议用双引号包裹,可以解析变量和转义字符
  2. 单引号会原样输出内容,不解析任何特殊字符
  3. 在脚本中使用时,建议明确使用-e-E以避免不同系统的行为差异
  4. 输出包含特殊字符时,建议使用转义或引号包裹
  5. 不同shell的echo行为可能略有不同,bash内置echo通常功能最全
  6. 对于复杂格式化输出,printf命令可能更合适

cat - 文件内容查看与合并工具

命令简介

cat(concatenate的缩写)是Linux中最常用的文件操作命令之一,主要用于查看文件内容、创建文件、合并文件以及将文件内容重定向到其他文件或设备。虽然功能简单,但在日常文件操作和脚本编写中不可或缺。

语法格式

bash
cat [选项] [文件...]

选项

选项描述示例
-n显示行号(包括空行)cat -n file.txt
-b显示行号(忽略空行)cat -b file.txt
-s压缩连续空行为一行cat -s file.txt
-E在每行结尾显示$符号cat -E file.txt
-T将制表符显示为^Icat -T file.txt
-A相当于-vET组合cat -A file.txt
--help显示帮助信息cat --help
--version显示版本信息cat --version

经典案例

bash
# 查看单个文件内容
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"

注意事项

  1. 不适合查看大文件(建议使用lessmore
  2. 合并文件时会保留原文件中的空行
  3. 使用重定向时要小心,>会覆盖目标文件
  4. 二进制文件使用cat查看可能导致终端混乱
  5. 在脚本中使用时,建议检查文件是否存在
  6. 某些系统可能有tac命令(反向显示文件内容)

more - 分页显示文件内容

命令简介

more 是一个经典的分页显示工具,用于逐页查看文件内容。相比 cat 命令,more 更适合查看大文件,支持向前翻页但无法向后回翻(这是 less 命令的优势)。

语法格式

bash
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显示帮助

经典案例

bash
# 基本分页查看
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

注意事项

  1. 相比 less 命令功能有限,不支持向后翻页
  2. 适合快速查看,复杂导航建议使用 less
  3. 二进制文件可能导致显示混乱
  4. 某些版本支持 +n 从第n行开始显示
  5. 在脚本中使用时可能不如 less 灵活

less - 高级文件查看工具

命令简介

less 是Linux中最强大的文件查看工具,相比 more 提供了更丰富的功能,支持前后翻页、搜索、标记位置等高级特性。它不会一次性加载整个文件,因此特别适合查看大文件。

语法格式

bash
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向下/上半页
Entere向下移动一行
yk向上移动一行
g跳到文件开头
G跳到文件末尾
50g跳到第50行
/pattern向前搜索
?pattern向后搜索
n重复上一次搜索
N反向重复搜索
v进入编辑器模式
h显示帮助
q退出

经典案例

bash
# 基本查看文件
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 恢复监控

注意事项

  1. less 不会修改原始文件
  2. 支持直接查看压缩文件(通过 zless
  3. 可以查看命令管道输出
  4. 搜索时支持正则表达式
  5. 退出后保留屏幕显示(除非使用 -X 选项)
  6. more 更节省内存,适合大文件

less 是Linux系统管理员和开发者的必备工具,掌握它的使用可以极大提高工作效率。

head - 查看文件头部内容

显示文件的前 N 行(默认 10 行),常用于快速预览文件。

语法格式

bash
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 <== ...

经典案例

bash
# 查看前 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 行),常用于日志监控。

语法格式

bash
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

经典案例

bash
# 查看日志最后 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、日志等)。

语法格式

bash
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

经典案例

bash
# 提取/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

注意事项

  1. 分隔符只能是一个字符(不支持多字符分隔符)
  2. 处理空格分隔文件时建议先用tr压缩空格:tr -s ' ' < file.txt | cut -d' ' -f2
  3. 字段编号从1开始(不是0)
  4. 包含中文等多字节字符时建议用-c而非-b
  5. 空字段会保留(使用-s可过滤无分隔符的行)
  6. awk更轻量但功能有限,复杂场景建议用awk

cut 是处理列式数据的利器,在日志分析、数据提取等场景中能极大提高效率。掌握它与grepsort等命令的组合使用,可以解决大多数文本处理需求。

tac - 反向显示文件内容

命令简介

taccat 命令的反向版本,用于将文件内容按行逆序显示(从最后一行到第一行)。名称来源于 "cat" 的反向拼写。特别适合查看日志文件时从最新内容开始阅读。

语法格式

bash
tac [选项] [文件...]

选项

选项描述示例
-b在行前而非行后添加分隔符tac -b file.log
-r将分隔符视为正则表达式tac -r sep.txt
-s使用指定字符串作为分隔符(默认换行符)tac -s "###" notes.txt
--help显示帮助信息tac --help
--version显示版本信息tac --version

经典案例

bash
# 基本反向显示文件
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

注意事项

  1. 大文件处理时性能优于人工逆序操作
  2. 默认按行处理,但可通过 -s 指定其他分隔方式
  3. 二进制文件可能导致输出混乱
  4. 某些系统可能需要安装 coreutils
  5. tail -r 功能类似,但 tac 更通用

tac 在处理日志分析、时间序列数据等需要从新到旧查看的场景中非常实用,是系统管理员和开发者的有力工具。

wc - 文件统计

统计文件的行数、单词数、字节数或字符数

语法格式

bash
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

经典案例

bash
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 统计字节数。

diff - 文件差异比较工具

命令简介

diff 用于比较两个文件或目录的差异,是代码审查、配置管理和文件同步的核心工具。

语法格式

bash
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

经典案例

bash
# 生成补丁文件
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.gz

sort - 文本排序工具

命令简介

sort 对文本行进行排序,支持多字段、多规则排序,是数据处理流水线的核心命令。

语法格式

bash
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

经典案例

bash
# 多字段排序(先第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.txt

uniq - 相邻行去重工具

命令简介

uniq 用于过滤相邻重复行,常与 sort 配合使用进行全局去重统计。

语法格式

bash
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

经典案例

bash
# 统计日志错误类型频率
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系统管理的必备技能。