Linux 命令行学习:数据流控制、文本处理、文件管理与自动化脚本 (第二天)
目标:掌握更多命令行技巧和文本处理工具。
1. 管道和重定向
(1)输入输出重定向
-
输出重定向 (
>
):将命令的输出写入到文件中,如果文件存在,则覆盖。
演示 :
- 输入重定向(<):将文件的内容作为命令的输入。
演示1:-w :计算output.txt 文件中的单词数
演示2:-l (统计 output.txt 文件中的行数)
-
追加重定向 (
>>
):将命令的输出追加到文件末尾,不会覆盖文件内容。
演示:
(2)管道 (|
)
管道将一个命令的输出作为另一个命令的输入,实现命令链的连接。
演示 :在 output.txt 中查找包含 "Hello" 的行
2.文本处理工具
(1)grep:文本搜索工具
-
基本用法:
grep <pattern> <file>
-
常用选项:
-i
:忽略大小写-n
:显示匹配的行号-v
:显示不匹配的行
演示1 :搜索 output.txt 文件中包含 "again" 的行
演示2 :-i : 搜索 output.txt 文件中包含 "Hello" 的行,忽略大小写
演示3 :-n :显示匹配的行号
演示4 :-v :显示不匹配的行
(2) sed:流编辑器
-
替换文本:
sed 's/old/new/' <file>
-
常用选项:
-i
:直接修改文件内容g
:全局替换
演示 1:将 output.txt 中的 "again" 替换为 "AGAIN",仅显示结果,不修改文件
注意 :output.txt 文件没有发生变化!
演示2 : -i :将 output.txt 中所有 "again" 替换为 "AGAIN" 并保存
(3) awk:文本处理工具
-
基本用法:
awk '{print $1}' <file>
,按列处理文本。
演示 1 :输出 output.txt 文件中每行的第1和第3列
演示2 :仅输出第3列值大于50的行的第1和第3列
3.文件查找和管理
(3) find:查找文件
-
基本用法:
find <path> -name <pattern>
-
常用选项:
-type f
:查找文件-type d
:查找目录-size
:按文件大小查找
演示1 : 在 /home/user 目录下查找所有 .txt 文件
演示2 :查找 /home/user 目录下大于1MB的文件
演示3 :在 /home/user
目录下,查找所有子目录
该命令会列出 /home/user
目录及其子目录中所有的目录名称。
演示4 :查找名称为 parent1 的目录:
演示5 :查找包含“grand”字样的目录
(4) locate:快速查找文件
-
使用
locate
查找文件,需要先更新数据库:
演示 :查找所有包含 "parent1" 的文件路径
4. 压缩和解压缩
(1)tar:打包和解包
-
打包文件:
tar -cvf <archive.tar> <file/dir>
-
解包文件:
tar -xvf <archive.tar>
演示1:将 /home/user/parent1 目录打包为 parent11.tar
演示2 :使用 tar -tf parent11.tar 查看打包文件的内容
演示3 : 解包 parent.tar 文件
(2)gzip 和 gunzip
-
压缩文件:
gzip <file>
演示 1: 压缩 archive.tar,生成 archive.tar.gz 并查看
演示 2:使用 tar -tf
查看 .tar.gz
文件内容
由于 parent11.tar.gz 是一个 .tar
文件经过 gzip
压缩后的产物,你可以使用 tar -tf
直接查看其中的内容,而不需要解压文件:
-
解压文件:
gunzip <file.gz>
演示2 :使用 gunzip
解压了 parent11.tar.gz
文件 并使用 tar -tf
命令查看parent11.tar
(3)zip 和 unzip
-
压缩文件:
zip <archive.zip> <file>
演示 :将 file1 和 file2 压缩为 File.zip
-
解压文件:
unzip <archive.zip>
演示 : 解压 File.zip 文件
PS :因为我这里当前路径下已经有 file1.txt 和 file2.txt 了,所以在我执行 unzip File.zip
命令后,系统提示是否要替换 file1.txt
和 file2.txt
。我这里选择了 y
(yes)替换, unzip
将压缩包中的文件解压并覆盖当前目录中已有的 file1.txt
和 file2.txt
文件。
5. 基础的 Shell 脚本
(1)编写简单的 Shell 脚本
Shell 脚本通常以 .sh
为后缀,第一行包含 #!/bin/bash
表示使用 Bash 解释器。
-
示例脚本:
演示1 :
1.1 创建文件 script.sh
1.2 在 nano
编辑器中输入以下内容:
#!/bin/bash
echo "Hello, World!"
#!/bin/bash
指定了脚本使用 Bash 解释器。
echo "Hello, World!"
会输出 “Hello, World!”。
1.3 在 nano
中,按 Ctrl + O
保存文件,按 Enter
确认 。
1.4 然后回车并按 Ctrl + X 退出编译器。
1.5 现在,文件 script.sh
已经存在,可以运行 chmod +x
来赋予执行权限:
1.6 赋予执行权限后,可以直接运行脚本:
(2)变量
- 定义变量:
2.1 使用 nano
编辑文件:
2.2 使用变量:
在 nano
中,按 Ctrl + O
保存文件,按 Enter
确认 。
然后回车并按 Ctrl + X 退出编译器。
2.3 运行脚本:
PS:
确保脚本有执行权限(如果之前没有执行过此操作):chmod +x script.sh
(3)条件语句(if)
-
基本格式:
演示1 : 使用 nano
编辑文件并输入
解释:
read -p "Enter a number: " num
提示用户输入一个数字,并将其存储在num
变量中。if [ $num -gt 10 ];
:检查num
是否大于 10。else
:如果num
不大于 10,则执行这一部分的代码。fi
:结束条件语句。
PS: “$num” 的两边,一定要有空格!
演示2 : 输出示例
(4)循环
-
for 循环:
演示1 : 使用 nano
编辑文件并输入
解释:
for i in 1 2 3 4 5;
定义循环,变量i
依次取 1 到 5 的值。do ... done
包含了循环体的代码,echo "Number: $i"
输出当前的i
值。
演示2 : 输出示例
-
while 循环:
演示1 :使用 nano 编辑文件并输入
解释:
count=1
初始化变量count
为 1。while [ $count -le 5 ];
:当count
小于或等于 5 时,执行循环体中的代码。((count++))
:将count
增加 1。do ... done
包含了循环体的代码,echo "Count: $count"
输出当前的count
值。
演示2 : 输出示例