一、grep
命令
grep 全称 Global Regular Expression Print,用来在文件中搜索符合条件的字符串/正则表达式,并输出匹配的行
语法
bash
grep [选项] 模式 文件
常用选项
-
-i
:忽略大小写 -
-n
:显示行号 -
-v
:显示 不匹配的行 -
-c
:只显示匹配的行数 -
-o
:只显示匹配到的内容 -
-r
:递归搜索子目录下所有文件 -
-E
:使用扩展正则表达式(相当于egrep
)
使用示例
bash
grep "main" hello.cpp # 在 hello.cpp 中查找包含 "main" 的行
grep -n "main" hello.cpp # 查找并显示行号
grep -i "error" log.txt # 忽略大小写查找 error
grep -v "test" data.txt # 输出不包含 test 的行
grep -c "for" hello.cpp # 统计 for 出现的行数
grep -r "TODO" ./src # 在 src 目录下递归查找 TODO
二、wc
命令
wc 全称 Word Count,用来统计文件内容的信息,包括:行数、单词数、字节数
语法
bash
wc [选项] 文件
常用选项
-
-l
:统计行数 -
-w
:统计单词数 -
-c
:统计字节数 -
-m
:统计字符数(字符区别于字节,见下文字符与字节的区别) -
-L
:输出文件中最长行的长度
使用示例
bash
wc file.txt # 输出 行数、单词数、字节数
wc -l file.txt # 统计行数
wc -w file.txt # 统计单词数
wc -c file.txt # 统计字节数
wc -m file.txt # 统计字符数(UTF-8 字符长度不同)
wc -L file.txt # 输出最长行的长度
字符与字节的区别
-
字节数(-c) :统计文件内容所占用的实际存储空间,也就是文件里有多少个字节
-
字符数(-m) :统计文件中有多少个人类可读的字符
区别在于:
-
对于 英文、数字、ASCII 符号,1 个字符 = 1 个字节。
-
对于 中文、日文、韩文等非 ASCII 字符 ,在 UTF-8 编码下,1 个字符 = 多个字节(通常 3 个字节)。
举例说明
假设我们有一个文件 test.txt
,内容如下:
bash
abc你好
这个文件里包含:
-
3 个英文字符 :
a b c
-
2 个中文字符 :
你 好
(1) 按字符数统计
bash
wc -m test.txt
结果:
5 test.txt
因为一共是 5 个字符
(2) 按字节数统计
bash
wc -c test.txt
结果(UTF-8 编码下):
bash
9 test.txt
因为:
-
abc
→ 3 个字节 -
你
→ 3 个字节 -
好
→ 3 个字节合计 = 9 字节
四、管道符
管道符号 |
用来 把前一个命令的输出,作为后一个命令的输入 。它是 Linux 中 组合命令、构建强大工具链 的核心
语法:
bash
命令1 | 命令2 | 命令3 ...
例子
bash
ls -l | grep ".cpp"
-
ls -l
:列出当前目录文件的详细信息 -
grep ".cpp"
:过滤出包含.cpp
的行👉 最终效果:只显示
.cpp
文件的详细信息
1. 统计匹配行数
bash
grep "error" log.txt | wc -l
-
grep
输出所有包含 "error" 的行 -
wc -l
统计这些行数👉 结果就是 "error" 出现的行数
2. 查看进程
bash
ps aux | grep ssh
-
ps aux
:列出所有进程 -
grep ssh
:筛选包含 "ssh" 的进程👉 快速找到相关进程
3. 分页查看
bash
dmesg | less
-
dmesg
输出内核日志(通常很长) -
less
分页显示,方便浏览
4. 排序 + 去重
bash
cat file.txt | sort | uniq
-
sort
:排序 -
uniq
:去除相邻的重复行👉 最终得到 去重后的有序结果。
5. 多重管道
bash
cat access.log | grep "200" | wc -l
-
cat
输出日志 -
grep "200"
过滤状态码 200 的记录 -
wc -l
统计数量👉 得到 成功访问次数
Linux 常见管道命令速查表
1. 文件内容处理
bash
cat file.txt | less # 分页查看文件
cat file.txt | sort | uniq # 排序并去重
cat file.txt | sort | uniq -c # 统计每行出现次数
cat file.txt | grep "hello" | wc -l # 统计包含 "hello" 的行数
2. 文本搜索
bash
grep "error" log.txt | less # 搜索 error 并分页显示
grep -i "warning" log.txt | wc -l # 忽略大小写搜索 warning 并统计行数
grep -r "TODO" ./src | wc -l # 递归搜索 TODO 并统计数量
3. 系统与进程管理
bash
ps aux | grep ssh # 查看 ssh 相关进程
ps aux | grep -v grep | grep ssh # 避免 grep 命令本身被匹配
ps -ef | grep nginx | wc -l # 统计 nginx 进程数量
4. 日志分析
bash
dmesg | grep usb # 查看内核日志中的 usb 相关信息
tail -f access.log | grep "404" # 实时查看 404 错误日志
cat access.log | grep "200" | wc -l # 统计成功请求数量
5. 统计与排序
bash
cat file.txt | wc -l # 统计行数
cat file.txt | wc -w # 统计单词数
cat file.txt | wc -c # 统计字节数
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 统计日志中各 IP 出现次数并按数量排序
6. 其他实用
bash
ls -l | grep "^d" # 只显示目录
history | grep ssh # 在历史命令中查找 ssh
find . -type f | wc -l # 统计当前目录下的文件数
-
grep → 筛选
-
wc → 统计
-
sort/uniq → 排序去重
-
less/more/head/tail → 查看
五、echo
命令
-
echo
用来 在终端输出字符串 或 变量的值 -
主要用于测试、调试、脚本输出
基本语法
bash
echo [选项] [字符串]
常用选项
-
-n
:输出内容后 不换行 -
-e
:启用转义字符(如\n
,\t
)
示例
bash
echo "Hello World" # 输出 Hello World
echo $HOME # 输出环境变量 HOME
echo -n "Hello" # 输出 Hello,但不换行
echo -e "A\nB\nC" # 输出多行 A B C
echo -e "Name\tAge" # 输出带制表符的表格
六、tail
命令
-
tail
用来 查看文件的末尾内容 -
默认显示 最后 10 行
基本语法
bash
tail [选项] [文件]
常用选项
-
-n <行数>
:显示文件末尾的指定行数 -
-f
:实时输出文件新增加的内容(常用于日志监控) -
-c <字节数>
:显示文件末尾的指定字节数
示例
bash
tail file.txt # 查看文件最后 10 行
tail -n 20 file.txt # 查看文件最后 20 行
tail -c 50 file.txt # 查看文件最后 50 个字节
tail -f log.txt # 实时监控 log.txt 的新增内容
tail -n 100 -f log.txt # 从最后 100 行开始,持续跟踪新增
tail -f
做了什么
-
tail file
默认显示文件的 最后 10 行。 -
加上
-f
(follow)后,tail
会先输出最后若干行(默认 10 行),然后持续运行,把文件新增的内容(被追加的字节)实时打印出来 -
常用场景:实时查看日志文件,调试输出等
示例:
bash
tail -f /var/log/syslog
- 这会先显示最后 10 行,然后当有新日志写入时立刻在终端显示
bash
tail -n 0 -f logfile # 只显示之后追加的新行
- 从现在开始只看新增行(不想看到历史内容)
七、重定向符
在 Linux 里,命令运行时会涉及到 三个标准文件描述符:
-
标准输入 (stdin):编号 0,默认来自键盘
-
标准输出 (stdout):编号 1,默认输出到终端
-
标准错误 (stderr):编号 2,默认输出到终端
重定向 就是改变它们的默认去向:
-
把输入从文件读进来,而不是键盘
-
把输出写到文件里,而不是屏幕
默认简写规则
-
标准输出 (1)
-
>
默认就是1>
-
>>
默认就是1>>
bashecho "hi" > out.txt # 等价于 echo "hi" 1> out.txt echo "hi" >> out.txt # 等价于 echo "hi" 1>> out.txt
-
-
标准输入 (0)
<
默认就是0<
bashwc -l < file.txt # 等价于 wc -l 0< file.txt
不能省略的情况
-
标准错误 (2)
2>
不能省略2
,因为默认是 stdout (1)
bashls not_exist 2> err.txt # 正确 ✅ ls not_exist > err.txt # 错误 ❌(这是把标准输出写到文件,而错误还是显示在屏幕)
-
混合输出时
bashcommand > all.log 2>&1 # stdout 和 stderr 都到 all.log
- 这里
2>&1
不能简写成>&1
,必须写清楚2
。
- 这里
常见的重定向符
1. 输出重定向
bash
command > file
- 把命令的 标准输出 写入文件(覆盖原内容)
例子:
bash
echo "Hello" > out.txt # 把 Hello 写入 out.txt
2. 追加重定向
bash
command >> file
- 把命令的输出 追加到文件末尾,不会覆盖原内容
例子:
bash
echo "World" >> out.txt # 把 World 追加到 out.txt
3. 输入重定向
bash
command < file
- 把文件作为命令的输入
例子:
bash
wc -l < out.txt # 统计 out.txt 的行数(输入来自文件,而不是键盘)
4. 错误输出重定向
bash
command 2> error.txt
- 把 标准错误 (stderr) 输出到文件。
例子:
bash
ls not_exist 2> err.log # 错误信息保存到 err.log