二、Linux文本处理与文件操作核心命令

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
函数计算FC,每月15万CU 3个月
简介: 熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。

思维导图

image.png
image.png
image.png
image.png
image.png

一、核心文本处理与搜索命令

1.1 文本内容搜索 (grep)

grep 是一个强大的文本搜索工具,用于在文件中管道输入中查找包含指定模式的行。

语法结构: grep [选项] '搜索模式' [文件名...]
常用选项:
-i: 忽略大小写进行搜索。
-v: 反向查找,显示不包含搜索模式的行。
-r-R: 递归搜索目录下的所有文件。
-w: 整词匹配,确保模式作为一个独立的单词出现。
-c: 只计数而不显示匹配的行。
-n: 显示行号
使用正则表达式:
^: 匹配行首。例如 ^root 匹配以 "root" 开头的行。
$: 匹配行尾。例如 nologin$ 匹配以 "nologin" 结尾的行。
.: 匹配任意单个字符。
*: 匹配前一个字符出现0次或多次
[]: 匹配括号内任意一个字符。例如 [abc]
^$: 匹配空行
\: 转义字符,用于匹配特殊字符本身,如 \. 匹配点号 .
代码示例:

# 在 /var/log/messages 文件中查找包含 error 的行 (需要相应权限)
grep error /var/log/messages

# 在 test 文件中查找 root,不区分大小写
grep -i root test

# 在 /etc/ssh/sshd_config 文件中显示所有非注释行 (不以 # 开头)
grep -v ^# /etc/ssh/sshd_config

# 在 /etc/passwd 文件中查找以 root 开头的行
grep ^root /etc/passwd

# 在 /etc/passwd 文件中查找以 bash 结尾的行
grep bash$ /etc/passwd

# 在 /etc/passwd 文件中查找包含 r..t 模式的行,如 root, r00t
grep r..t /etc/passwd

# 计算 /etc/passwd 中包含 bash 的行数
grep -c 'bash' /etc/passwd

# 在 /etc/ssh/sshd_config 及其子目录中递归查找包含 Port 的行
grep -r Port /etc/ssh/

1.2 文件统计 (wc)

wc (Word Count) 命令用于统计文件或输入的行数、单词数和字节数

语法结构: wc [选项] [文件名...]
常用选项:
-l: 只统计行数
-w: 只统计单词数
-c: 只统计字节数
-m: 只统计字符数,在处理多字节字符时与 -c 不同。
输出格式: 默认情况下,wc 会依次输出 行数 单词数 字节数 文件名
代码示例:

# 显示 /etc/hosts 文件的行数、单词数和字节数
wc /etc/hosts

# 只显示 /etc/passwd 文件的行数
wc -l /etc/passwd

# 只显示 test 文件的单词数
wc -w test

# 同时统计 /etc/hosts 和 /etc/passwd 两个文件,并显示总计
wc /etc/hosts /etc/passwd

# 统计 /bin 目录下的文件总数 (通过管道)
ls /bin | wc -l

# 统计当前系统中正在运行的进程总数 (通过管道)
ps -ef | wc -l

1.3 输出文本 (echo)

echo 命令用于在终端显示一行文本或变量

语法结构: echo [选项] [字符串]
常用选项:
-e: 启用反斜杠转义字符的解释 (如 \n 换行, \t 制表符)。
-n: 输出后不附加换行符。
代码示例:

# 简单输出字符串
echo hello

# 显示环境变量 PATH 的值
echo $PATH

# 解释转义字符:输出两行,第二行有缩进
echo -e First line\n\tSecond line

# 创建一个新文件并写入内容 (覆盖)
echo "This is a test" > test_file.txt

# 向文件追加内容
echo "Another line" >> test_file.txt

二、高级文件操作与管理

2.1 通配符与大括号扩展

通配符是特殊字符,用于在文件名匹配代表一个或多个字符。

* (星号): 匹配任意长度任意字符 (0个或多个)。
代码示例:

# 列出当前目录下所有以 .log 结尾的文件
ls *.log

# 删除当前目录下所有以 .tmp 结尾的文件
rm -f *.tmp

? (问号): 匹配任意单个字符。
代码示例:

# 列出名为 file1.txt, file2.txt ... file9.txt 的文件
ls file?.txt

# 列出所有由3个字符组成且以 .log 结尾的文件,如 abc.log
ls ???.log

[] (方括号): 匹配括号内任意一个字符 (如 [abc]) 或范围 (如 [0-9])。
代码示例:

# 列出以 a, b, 或 c 开头,并以 .sh 结尾的文件
ls [abc]*.sh

# 列出名为 file0.dat 到 file9.dat 的文件
ls file[0-9].dat

{} (大括号扩展): 生成任意字符串序列。这不是严格意义上的通配符,而是在命令执行前由Shell进行扩展。
{..} (序列): 表示一个连续的序列。
代码示例:

# 批量创建文件 file1.txt 到 file5.txt
touch file{
   1..5}.txt

# 只创建file6.txt 和file9.txt
touch file{
   6,9}.txt

# 验证创建结果
ls file?.txt

# 批量创建目录
mkdir -p project/{
   source,build,docs}
# 验证创建结果
ls project/

2.2 管道 (Pipe: |) 与重定向

管道 |: 将一个命令的输出作为另一个命令的输入
重定向 (>, >>, 2>, &>) : 将命令的输出保存到文件中。

语法结构:
命令1 | 命令2
命令 > 文件名: 标准输出覆盖重定向。
命令 >> 文件名: 标准输出追加重定向。
2> 文件名: 标准错误覆盖重定向。
&> 文件名: 标准输出和标准错误同时覆盖重定向。
代码示例:

# 查看所有进程,并通过管道过滤出包含 "httpd" 的行
ps -ef | grep httpd

# 将 / 目录的详细列表覆盖写入到 root_listing.txt 文件
ls -l / > root_listing.txt

# 将当前日期和时间追加到 server_uptime.log 文件
date >> server_uptime.log

# 查找名为 missing.file 的文件,并将可能出现的错误信息写入 find_errors.log
find / -name missing.file 2> find_errors.log

# 尝试列出一个不存在的目录,将标准输出和错误输出都写入 all_output.log
ls /not_exist_dir &> all_output.log

2.3 文件查找 (find)

find 用于在指定目录按条件查找文件或目录。它非常强大,因为可以组合多种条件

语法结构: find [路径...] [选项] [表达式]
常用选项:
-name '文件名': 按名称查找,区分大小写,支持通配符。
-iname '文件名': 按名称查找,但不区分大小写 (Ignore case)。
-type <类型>: 按文件类型查找,f (普通文件), d (目录), l (符号链接)。
-user '用户名': 按文件所有者查找。
-group '组名': 按文件所属组查找。
-size [+|-]大小: 按文件大小查找。
-mtime <天数>: 按修改时间 (Modification Time) 查找。
-exec '命令' {} \;: 对找到的每个文件执行指定的命令。{}找到的文件名的占位符。
代码示例:

# 在 /etc 目录及其子目录下查找所有以 .conf 结尾的文件 (区分大小写)
find /etc -name *.conf

# 在 /etc 目录及其子目录下查找所有以 .conf 或 .CONF 结尾的文件 (不区分大小写)
find /etc -iname *.conf

# 在 /home 目录下查找所有属于用户 ivan 的文件和目录
find /home -user ivan

# 在 /srv 目录下查找所有属于 apache 组的文件和目录
find /srv -group apache

# 查找所有大于1GB的普通文件
find /home -type f -size +1G

# 查找所有小于100KB的普通文件
find /var/log -type f -size -100k

# 在当前目录及子目录下查找7天内被修改过的普通文件
find . -type f -mtime -7

# 查找 /tmp 目录下所有以 .tmp 结尾的文件,并安全地删除它们
find /tmp -name *.tmp -exec rm -f {
   } \;

# 查找属于用户 webadmin 且大于10MB的文件
find /var/www -user webadmin -type f -size +10M

2.4 打包与压缩

tar: 打包工具,可以将多个文件或目录归档成一个文件
语法结构: tar [选项] [目标文件名] [源文件或目录]
常用选项:
-c: 创建 (Create) 一个新的归档文件。
-x: 提取 (Extract) 归档文件中的内容。
-v: 显示详细过程 (Verbose)。
-f: 指定归档文件名 (File),此选项必须放在最后
-z: 使用 gzip 进行压缩/解压 (后缀 .tar.gz.tgz)。
-j 使用 bzip2 进行压缩/解压 (后缀 .tar.bz2)。
-C <目录>: 指定解压到哪个目录。
代码示例:

# 将 my_project 目录打包成 my_project.tar
tar -cvf my_project.tar my_project/

# 将 my_project 目录打包并用 gzip 压缩成 my_project.tar.gz
tar -czvf my_project.tar.gz my_project/

# 将 my_project 目录打包并用 bzip2 压缩成 my_project.tar.bz2
tar -cjvf my_project.tar.bz2 my_project/

# 解压 my_project.tar 到当前目录
tar -xvf my_project.tar

# 解压 my_project.tar.gz 到当前目录
tar -xzvf my_project.tar.gz

# 将 my_project.tar.bz2 解压到 /opt/ 目录下
tar -xjvf my_project.tar.bz2 -C /opt/

zip / unzip: 创建和解压 .zip 格式的压缩文件,与Windows兼容性好
语法结构: zip [选项] [目标.zip] [源]unzip [选项] [源.zip]
代码示例:

# 将 documents 目录及其内容递归压缩成 documents.zip
zip -r documents.zip documents/

# 解压 documents.zip 到当前目录
unzip documents.zip

# 将 archive.zip 解压到指定的 /path/to/destination 目录
unzip archive.zip -d /path/to/destination

gzip / gunzip: 对单个文件进行压缩/解压
代码示例:

# 压缩 large_log_file,生成 large_log_file.gz,原文件会消失
gzip large_log_file

# 解压 large_log_file.gz,生成 large_log_file,原压缩文件会消失
gunzip large_log_file.gz

bzip2 / bunzip2: 压缩率更高单个文件压缩工具。
代码示例:

# 压缩 another_large_file
bzip2 another_large_file

# 解压 another_large_file.bz2
bunzip2 another_large_file.bz2

三、总结

本章深入介绍了Linux中文件内容处理(包括搜索、查找、统计、重定向和通配符)以及打包压缩核心操作。熟练掌握这些命令,将极大提升您在Linux环境下的工作效率


练习题

请在您的Linux环境中完成以下操作,并写出所使用的命令。

题目:

  1. /etc 目录及其子目录中,查找所有以 .conf 结尾的文件。
  2. /etc/passwd 文件中,查找以 "root" 开头的所有行。
  3. /etc/passwd 文件中,查找以 "nologin" 结尾的所有行。
  4. 统计 /etc/passwd 文件中共有多少个用户账户 (即多少行)。
  5. 使用 echo 命令将包含换行符的文本 "Line One\nLine Two" 正确地覆盖写入到你家目录下的 multi_line.txt 文件中。
  6. 使用大括号扩展,一次性创建名为 image_01.jpg, image_02.jpg, image_03.jpg 三个空文件。
  7. /etc 目录打包成一个名为 etc_backup.tar 的文件,存放在你家目录下。
  8. 将你家目录下的 etc_backup.tar 文件使用 gzip 压缩,生成 etc_backup.tar.gz
  9. 创建一个名为 test_dir 的目录,然后在其中创建几个文件,最后将 test_dir 目录打包并使用 bzip2 压缩成 test_dir.tar.bz2
  10. etc_backup.tar.gz 文件解压到 /tmp 目录下。
  11. ls -l / 命令的错误输出 (如果有的话,比如权限不足的目录) 重定向到你家目录下的 ls_errors.log 文件中。
  12. 统计当前系统中 sshd 进程的数量。
  13. /etc/services 文件中,查找所有不包含 "tcp" 的行。
  14. 创建一个名为 data 的目录,并将其打包压缩成与Windows兼容的 data.zip 文件。
  15. 查找 /var/log 目录下,所有在最近24小时内被修改过的文件。
答案与解析:
  1. 查找 .conf 文件:

    find /etc -name '*.conf'
    

    解析: find 命令在 /etc 路径下,使用 -name 选项和通配符 * 按名称查找。

  2. 查找以 "root" 开头的行:

    grep '^root' /etc/passwd
    

    解析: grep 使用正则表达式 ^ 来匹配行的开始。

  3. 查找以 "nologin" 结尾的行:

    grep 'nologin$' /etc/passwd
    

    解析: grep 使用正则表达式 $ 来匹配行的结束。

  4. 统计行数:

    wc -l /etc/passwd
    

    解析: wc (Word Count) 命令使用 -l 选项来只统计文件的行数 (Lines)。

  5. 使用 echo 输出多行:

    echo -e "Line One\nLine Two" > ~/multi_line.txt
    

    解析: echo-e 选项启用了对转义字符 \n (换行符) 的解释。> 是覆盖重定向。

  6. 使用大括号扩展创建文件:

    touch image_{
         01..03}.jpg
    

    解析: {01..03} 会被Shell扩展为 01 02 03touch 命令因此会一次性创建三个文件。

  7. 打包目录:

    tar -cvf ~/etc_backup.tar /etc
    

    解析: tar 使用 -c (创建), -v (详细过程), -f (指定文件名) 选项来打包 /etc 目录。

  8. 使用gzip压缩文件:

    gzip ~/etc_backup.tar
    

    解析: gzip 直接对指定文件进行压缩,生成 .gz 后缀的文件,并通常会删除原文件。或者在打包时一步到位:tar -czvf ~/etc_backup.tar.gz /etc

  9. 打包并用bzip2压缩:

    mkdir test_dir
    touch test_dir/file1 test_dir/file2
    tar -cjvf test_dir.tar.bz2 test_dir/
    

    解析: tar-j 选项调用 bzip2 进行压缩,一步完成打包和压缩。

  10. 解压到指定目录:

    tar -xzvf ~/etc_backup.tar.gz -C /tmp
    

    解析: tar 使用 -x (提取), -z (gzip解压), -v, -f 选项,并用 -C 选项指定解压的目标目录。

  11. 重定向错误输出:

    ls -l / 2> ~/ls_errors.log
    

    解析: 2> 是标准错误输出的覆盖重定向符号。

  12. 统计进程数量:

    ps -ef | grep 'sshd' | grep -v 'grep' | wc -l
    

    解析: ps -ef 列出所有进程,grep 'sshd' 筛选出sshd相关行,grep -v 'grep' 排除掉grep命令本身这一行,最后 wc -l 统计行数。

  13. 反向查找:

    grep -v 'tcp' /etc/services
    

    解析: grep-v 选项用于显示不匹配指定模式的行。

  14. 创建zip压缩包:

    mkdir data
    zip -r data.zip data/
    

    解析: zip 命令使用 -r 选项来递归地压缩整个目录。

  15. 查找最近修改的文件:

    find /var/log -mtime -1
    

    解析: find-mtime -1 选项表示查找在过去24小时(1天)内被修改过的文件。

目录
相关文章
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
282 137
|
2月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
637 57
|
5月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
479 143
linux命令—tree
|
1月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
334 2
|
2月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
210 0
Linux内存问题排查命令详解
|
2月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
230 16
|
4月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
786 13
|
5月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
861 21
|
5月前
|
监控 Linux
Linux系统中使用df命令详解磁盘使用情况。
`df`命令是Linux系统管理员和用户监控和管理磁盘空间使用的重要工具。掌握它的基本使用方法和选项可以帮助在必要时分析和解决空间相关问题。简洁但功能丰富,`df`命令确保了用户可以快速有效地识别和管理文件系统的空间使用情况。
385 13
|
3月前
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
495 0