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