Linux 基本命令超详细解释第三期 grep | wc | 管道符‘|’ | echo | tail | 重定向符

一、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>

    • >> 默认就是 1>>

    bash 复制代码
    echo "hi" > out.txt     # 等价于 echo "hi" 1> out.txt
    echo "hi" >> out.txt    # 等价于 echo "hi" 1>> out.txt
  2. 标准输入 (0)

    • < 默认就是 0<
    bash 复制代码
    wc -l < file.txt        # 等价于 wc -l 0< file.txt

不能省略的情况

  1. 标准错误 (2)

    • 2> 不能省略 2,因为默认是 stdout (1)
    bash 复制代码
    ls not_exist 2> err.txt   # 正确 ✅
    ls not_exist > err.txt    # 错误 ❌(这是把标准输出写到文件,而错误还是显示在屏幕)
  2. 混合输出时

    bash 复制代码
    command > 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
相关推荐
小生不才yz4 小时前
(三)命令管理-命令历史-history命令的使用
linux
aramae6 小时前
Linux开发工具入门:零基础到熟练使用(二)
linux·运维·服务器·网络·笔记
nassi_6 小时前
I/O详解
linux·php
泡沫冰@7 小时前
shell编程:sed - 流编辑器(6)
linux
爱吃喵的鲤鱼7 小时前
仿muduo库One Thread One Loop主从Reactor模型实践——介绍
linux·c++
庄风子7 小时前
In VI, when an arrow key is pressed, a character (e.g. “A“) is sent.
linux·vi
Suger9998 小时前
centos网络打流测试
linux·网络·centos
小何好运暴富开心幸福9 小时前
操作系统之初识Linux
linux·运维·服务器·bash
こ进制掌控者9 小时前
Ubuntu server 24.04.3 设置静态IP
linux·tcp/ip·ubuntu