Ubuntu 22.04中的过滤器知识点详解
一、过滤器概述
过滤器是Ubuntu中处理文本流的工具,可读取输入(文件或管道)、转换内容并输出结果,常用于文本处理、数据提取与分析。Ubuntu默认预装大部分过滤器工具,无需额外配置。
二、简单过滤器
1. cat命令
1.1 用途
连接文件内容、打印文件到终端,或创建简单文本文件。
1.2 核心语法
cat [选项] [文件...]
常用选项:
-n:显示所有行的行号(包括空行);-b:仅显示非空行的行号;-s:压缩连续空行为一行;-E:在每行末尾显示$符号。
1.3 案例代码
bash
# 1. 打印单个文件内容
cat test.txt
# 2. 显示行号(包括空行)
cat -n test.txt
# 3. 仅非空行显示行号
cat -b test.txt
# 4. 连接多个文件并输出到新文件
cat file1.txt file2.txt > combined.txt
# 5. 创建简单文本文件(按Ctrl+D结束输入)
cat > new_file.txt << EOF
Hello World
Ubuntu 22.04
EOF
2. head命令
2.1 用途
显示文件的前N行(默认前10行)。
2.2 核心语法
head [选项] [文件]
常用选项:
-n <行数>:指定显示的行数(如-n 5或-5);-c <字节数>:显示前N字节内容。
2.3 案例代码
bash
# 1. 显示文件前10行(默认)
head test.txt
# 2. 显示前5行
head -n 5 test.txt # 等价于head -5 test.txt
# 3. 显示前20字节内容
head -c 20 test.txt
# 4. 显示多个文件的前3行
head -n 3 file1.txt file2.txt
3. tail命令
3.1 用途
显示文件的后N行(默认后10行),或实时跟踪文件更新(如日志)。
3.2 核心语法
tail [选项] [文件]
常用选项:
-n <行数>:指定显示的行数(如-n 5或-5);-f:实时跟踪文件新增内容(按Ctrl+C退出);-F:跟踪文件(即使文件被删除/重建也继续);-c <字节数>:显示后N字节内容。
3.3 案例代码
bash
# 1. 显示文件后10行(默认)
tail test.txt
# 2. 显示后5行
tail -n 5 test.txt
# 3. 实时跟踪日志文件(如系统日志)
tail -f /var/log/syslog
# 4. 显示文件最后20字节
tail -c 20 test.txt
4. nl命令
4.1 用途
为文件添加行号并打印(比cat -n更灵活)。
4.2 核心语法
nl [选项] [文件]
常用选项:
-b a:为所有行加行号(包括空行,同cat -n);-b t:仅为非空行加行号(默认);-w <宽度>:设置行号宽度(默认6);-s <分隔符>:设置行号与内容的分隔符(默认制表符)。
4.3 案例代码
bash
# 1. 默认显示(非空行加行号)
nl test.txt
# 2. 所有行加行号,行号宽度设为3,分隔符为"."
nl -b a -w 3 -s "." test.txt
5. tac命令
5.1 用途
反向打印文件内容(从最后一行到第一行)。
5.2 核心语法
tac [选项] [文件]
常用选项:
-s <分隔符>:按指定分隔符反向(默认换行符)。
5.3 案例代码
bash
# 1. 反向打印文件
tac test.txt
# 2. 按分号分隔反向(如CSV文件)
tac -s ";" data.csv
6. rev命令
6.1 用途
反转每行字符顺序。
6.2 核心语法
rev [文件]
6.3 案例代码
bash
# 1. 反转文件每行内容
rev test.txt
# 2. 结合管道反转echo输出
echo "Hello World" | rev # 输出:dlroW olleH
7. wc命令
7.1 用途
统计文件的行数、单词数、字节数。
7.2 核心语法
wc [选项] [文件]
常用选项:
-l:仅统计行数;-w:仅统计单词数;-c:仅统计字节数;-m:仅统计字符数(含多字节字符,如中文);-L:显示最长行的长度。
7.3 案例代码
bash
# 1. 显示所有统计信息(行数、单词数、字节数、文件名)
wc test.txt
# 2. 仅统计行数
wc -l test.txt
# 3. 统计多个文件的单词数
wc -w file1.txt file2.txt
# 4. 显示最长行长度
wc -L test.txt
8. sort命令
8.1 用途
对文本行进行排序(默认按ASCII码升序)。
8.2 核心语法
sort [选项] [文件]
常用选项:
-n:按数值大小排序;-r:降序排序;-k <列号>:按指定列排序;-t <分隔符>:指定列分隔符;-u:去重(仅保留唯一行);-f:忽略大小写。
8.3 案例代码
bash
# 1. 默认升序排序
sort test.txt
# 2. 数值降序排序
sort -n -r numbers.txt
# 3. 按第2列(冒号分隔)排序
sort -t ":" -k 2 passwd.txt
# 4. 排序并去重
sort -u duplicates.txt
9. uniq命令
9.1 用途
去除连续重复行(需先排序),统计重复次数。
9.2 核心语法
uniq [选项] [文件]
常用选项:
-c:统计每行重复次数;-d:仅显示重复行;-u:仅显示唯一行;-i:忽略大小写。
9.3 案例代码
bash
# 1. 去除连续重复行(需先排序)
sort duplicates.txt | uniq
# 2. 统计每行重复次数
sort duplicates.txt | uniq -c
# 3. 仅显示重复行
sort duplicates.txt | uniq -d
# 4. 仅显示唯一行
sort duplicates.txt | uniq -u
三、正则表达式
正则表达式是文本匹配的模式语言,用于过滤、提取或替换文本,Ubuntu工具(如grep、sed、awk)均支持正则。
1. 基本元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
. |
匹配任意单个字符(除换行) | a.c匹配abc/a1c |
* |
匹配前一个字符0次或多次 | ab*匹配a/ab/abb |
+ |
匹配前一个字符1次或多次 | ab+匹配ab/abb |
? |
匹配前一个字符0次或1次 | ab?匹配a/ab |
[] |
匹配括号内任意字符 | [abc]匹配a/b/c |
[^] |
匹配括号外任意字符 | [^abc]匹配非a/b/c的字符 |
| ` | ` | 分支(或) |
2. 特殊字符元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
\d |
匹配数字(等价[0-9]) |
\d{3}匹配3位数字 |
\w |
匹配字母/数字/下划线 | \w+匹配单词 |
\s |
匹配空白字符(空格/制表符) | \s+匹配多个空格 |
\D |
匹配非数字 | \D匹配字母/符号 |
\W |
匹配非字母/数字/下划线 | \W匹配符号 |
\S |
匹配非空白字符 | \S+匹配非空白内容 |
3. POSIX字符类
| 类 | 含义 | 等价 |
|---|---|---|
[:alnum:] |
字母+数字 | [a-zA-Z0-9] |
[:alpha:] |
字母 | [a-zA-Z] |
[:digit:] |
数字 | [0-9] |
[:lower:] |
小写字母 | [a-z] |
[:upper:] |
大写字母 | [A-Z] |
[:space:] |
空白字符 | [\t\n\f\r ] |
4. 重复量词
| 量词 | 含义 | 示例 |
|---|---|---|
{n} |
匹配前一个字符n次 | a{3}匹配aaa |
{n,} |
匹配前一个字符至少n次 | a{2,}匹配aa/aaa |
{n,m} |
匹配前一个字符n到m次 | a{2,3}匹配aa/aaa |
5. 位置匹配
| 元字符 | 含义 | 示例 |
|---|---|---|
^ |
行首匹配 | ^Hello匹配以Hello开头的行 |
$ |
行尾匹配 | World$匹配以World结尾的行 |
\b |
单词边界 | \bcat\b匹配单词cat(非category) |
6. 子表达式与分支
- 子表达式:用
()包裹,可分组或捕获,如(ab)+匹配ab/abab; - 分支:用
\|表示"或",如(cat\|dog)匹配cat或dog。
7. 回调引用
用\n引用第n个捕获组的内容,如替换时(a)(b)可通过\2\1反转成ba。
8. 前后预查
- 正向预查:
(?=pattern)匹配后面是pattern的内容,如a(?=b)匹配后面是b的a; - 负向预查:
(?!pattern)匹配后面不是pattern的内容,如a(?!b)匹配后面不是b的a。
四、grep家族
1. 概述
grep用于按模式搜索文本,家族包括:
grep:基本正则表达式(BRE);egrep(等价grep -E):扩展正则表达式(ERE);fgrep(等价grep -F):固定字符串匹配(无正则)。
2. 安装
Ubuntu默认预装,缺失时安装:
bash
sudo apt update
sudo apt install -y grep
3. 核心语法
grep [选项] "模式" [文件...]
常用选项:
-E:启用扩展正则;-F:固定字符串匹配;-i:忽略大小写;-v:反向匹配(显示不匹配的行);-n:显示匹配行的行号;-c:仅统计匹配行数;-o:仅显示匹配的部分;-r:递归搜索目录下的文件;-A <n>:显示匹配行后n行;-B <n>:显示匹配行前n行;-C <n>:显示匹配行前后n行。
4. 案例代码
bash
# 1. 基本匹配(搜索包含"Ubuntu"的行)
grep "Ubuntu" test.txt
# 2. 忽略大小写匹配
grep -i "ubuntu" test.txt
# 3. 扩展正则匹配(匹配以Hello开头或World结尾的行)
grep -E "^Hello|World$" test.txt
# 4. 反向匹配(显示不含"error"的行)
grep -v "error" log.txt
# 5. 递归搜索目录下包含"TODO"的文件
grep -r "TODO" /home/user/code/
# 6. 显示匹配行的行号和后2行
grep -n -A 2 "warning" log.txt
# 7. 仅统计匹配行数
grep -c "success" result.txt
五、sed流编辑
1. 概述
sed(Stream Editor)是流式文本编辑器,用于批量替换、删除、插入文本,支持正则表达式。
2. 安装
Ubuntu默认预装,缺失时安装:
bash
sudo apt update
sudo apt install -y sed
3. 核心语法
sed [选项] '命令' [文件]
常用选项:
-e:执行多个编辑命令;-f:从文件读取编辑命令;-i:直接修改原文件(建议加-i.bak备份原文件);-n:静默模式(仅显示匹配的行)。
4. 内部命令
| 命令 | 含义 | 示例 |
|---|---|---|
s |
替换文本(s/旧/新/标记) |
s/old/new/g全局替换 |
d |
删除指定行 | 3d删除第3行 |
a |
在指定行后插入文本 | 3a Hello在第3行后插入 |
i |
在指定行前插入文本 | 3i Hello在第3行前插入 |
p |
打印指定行(需-n) |
2p打印第2行 |
c |
替换整行内容 | 3c New line替换第3行 |
替换标记:
g:全局替换;n:替换第n次匹配;p:打印匹配的行;w:将结果写入文件。
5. 案例代码
bash
# 1. 替换文本(将第一个"old"替换为"new")
sed 's/old/new/' test.txt
# 2. 全局替换(所有"old"替换为"new")
sed 's/old/new/g' test.txt
# 3. 直接修改原文件(并备份为test.txt.bak)
sed -i.bak 's/error/ERROR/g' log.txt
# 4. 删除第3行
sed '3d' test.txt
# 5. 删除包含"temp"的行
sed '/temp/d' test.txt
# 6. 在第5行前插入文本
sed '5i This is a new line' test.txt
# 7. 替换并仅显示修改的行(-n+p)
sed -n 's/Hello/Hi/gp' test.txt
# 8. 多个编辑命令(删除空行+替换)
sed -e '/^$/d' -e 's/foo/bar/g' test.txt
六、cut抽取
1. 概述
cut用于从文本行中抽取指定字段(列)。
2. 核心语法
cut [选项] [文件]
常用选项:
-d <分隔符>:指定字段分隔符(默认制表符);-f <字段号>:指定抽取的字段(如1,3抽取第1、3列,2-4抽取2-4列);-c <字符位置>:抽取指定字符位置(如1-5抽取前5个字符)。
3. 案例代码
bash
# 1. 抽取/etc/passwd的第1列(用户名,冒号分隔)
cut -d ":" -f 1 /etc/passwd
# 2. 抽取第1和第6列(用户名和家目录)
cut -d ":" -f 1,6 /etc/passwd
# 3. 抽取每行前5个字符
cut -c 1-5 test.txt
# 4. 从管道抽取字段(echo输出按空格分隔的第2列)
echo "apple banana cherry" | cut -d " " -f 2
七、awk编程
1. 概述
awk是编程语言级别的文本处理工具,支持数据提取、计算、流程控制,Ubuntu默认使用gawk(GNU awk)。
2. 安装
Ubuntu默认预装gawk,缺失时安装:
bash
sudo apt update
sudo apt install -y gawk
3. 核心语法
awk [选项] '脚本' [文件]
脚本结构:BEGIN{初始化} 条件{处理} END{收尾}
4. 工作流程
BEGIN块:处理数据前执行(仅一次);- 逐行处理:读取每行,按字段分隔符拆分字段,执行匹配的处理块;
END块:处理完所有行后执行(仅一次)。
5. 内置变量(预定义变量)
| 变量 | 含义 |
|---|---|
$0 |
整行内容 |
$1-$n |
第1到n个字段 |
NF |
当前行的字段总数 |
NR |
当前处理的行号 |
FS |
字段分隔符(默认空格/制表符) |
OFS |
输出字段分隔符(默认空格) |
RS |
行分隔符(默认换行符) |
ORS |
输出行分隔符(默认换行符) |
6. 案例代码
6.1 基础字段提取
bash
# 1. 提取/etc/passwd的用户名($1)和家目录($6),冒号分隔
awk -F ":" '{print $1, "->", $6}' /etc/passwd
# 2. 显示行号和整行内容
awk '{print NR, $0}' test.txt
# 3. 显示字段总数大于3的行
awk 'NF > 3 {print $0}' data.txt
6.2 自定义变量与外部变量传递
bash
# 1. 自定义变量(统计奇数行)
awk '{count=NR%2; if(count==1) print $0}' test.txt
# 2. 传递外部变量(用-v选项)
threshold=50
awk -v thresh=$threshold '$3 > thresh {print $0}' scores.txt
6.3 运算与判断
bash
# 1. 计算数值列的总和(第2列为数值)
awk '{sum += $2} END {print "总和:", sum}' numbers.txt
# 2. 条件判断(筛选第3列>80的行)
awk -F "," '$3 > 80 {print $1, "优秀"}' scores.csv
6.4 设置字段分隔符
bash
# 1. 用-F指定分隔符(逗号)
awk -F "," '{print $2}' data.csv
# 2. 在BEGIN块设置FS(制表符+空格)
awk 'BEGIN{FS="[ \t]+"} {print $1}' test.txt
6.5 流程控制语句
bash
# 1. if-else判断
awk -F ":" '{if($3 >= 1000) print $1, "普通用户"; else print $1, "系统用户"}' /etc/passwd
# 2. for循环(遍历字段)
awk '{for(i=1; i<=NF; i++) print "字段"i":", $i}' test.txt
# 3. while循环(统计字符数)
awk '{i=1; while(i<=length($0)) {count++; i++} END{print "总字符数:", count}}' test.txt
6.6 数组应用
bash
# 1. 统计单词出现次数
awk '{for(i=1; i<=NF; i++) arr[$i]++} END{for(word in arr) print word, arr[word]}' words.txt
# 2. 按出现次数排序(结合sort)
awk '{for(i=1; i<=NF; i++) arr[$i]++} END{for(word in arr) print arr[word], word}' words.txt | sort -nr
6.7 内置函数
bash
# 1. 字符串函数(length、substr、gsub)
awk '{print length($0), substr($0,1,5)}' test.txt # 长度+前5字符
awk '{gsub("old","new"); print $0}' test.txt # 全局替换
# 2. 数值函数(sqrt、int)
awk '{print sqrt($1), int($1/2)}' numbers.txt # 平方根+取整
# 3. 时间函数(systime、strftime)
awk 'BEGIN{print strftime("%Y-%m-%d %H:%M:%S", systime())}' # 当前时间
八、Perl一行式命令
概述
Perl是强大的文本处理语言,一行式命令常用于快速文本操作(需安装perl):
bash
sudo apt install -y perl
# 示例:替换文本(全局替换old为new)
perl -pe 's/old/new/g' test.txt
# 示例:统计单词数
perl -lane '$count += @F; END {print $count}' test.txt
九、小结
Ubuntu过滤器工具覆盖文本处理全场景:
- 简单处理用
cat/head/tail/wc; - 排序去重用
sort/uniq; - 模式匹配用
grep; - 批量编辑用
sed; - 字段抽取用
cut; - 复杂计算与流程控制用
awk。
正则表达式是过滤器的核心增强工具,需熟练掌握元字符与匹配规则以提升处理效率。