Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04中的过滤器知识点详解(13)

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. 工作流程

  1. BEGIN块:处理数据前执行(仅一次);
  2. 逐行处理:读取每行,按字段分隔符拆分字段,执行匹配的处理块;
  3. 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
    正则表达式是过滤器的核心增强工具,需熟练掌握元字符与匹配规则以提升处理效率。
相关推荐
牛奔2 小时前
Linux 的日志分析命令
linux·运维·服务器·python·excel
飞Link2 小时前
【Linux】Linux(CentOS7)配置SSH免密登录
linux·运维·服务器
飞Link2 小时前
【Java】Linux(CentOS7)下安装JDK8(Java)教程
java·linux·运维·服务器
努力的小帅2 小时前
Linux_进程信号(Linux入门到精通)
linux·信号处理·信号捕捉·进程控制·linux入门
秋4272 小时前
ansible剧本
linux·服务器·ansible
oMcLin2 小时前
Linux系统的香港服务器性能调优指南:从 CPU、内存到 I/O
linux·运维·服务器
Lueeee.3 小时前
Linux 字符设备驱动中 “主次设备号的静态 / 动态分配” 实验
linux
stars-he3 小时前
FPGA学习笔记(8)以太网UDP数据报文发送电路设计(二)
网络·笔记·学习·fpga开发
不爱学习的笨蛋3 小时前
ubuntu安装gitlab
linux·ubuntu·gitlab