【鸟哥的linux私房菜】查缺补漏(二)Bash的使用
前言
本文是笔者回顾复习《鸟哥的linux私房菜》时候对遗忘点的巩固笔记,同时还参考了github链接: 命令行的艺术结合具体例子加深理解,非详细学习笔记
基础
-
学会如何使用 man 命令去阅读文档。学会使用 apropos 去查找文档。知道有些命令并不对应可执行文件,而是在 Bash 内置好的,此时可以使用 help 和 help -d 命令获取帮助信息。你可以用 type 命令 来判断这个命令到底是可执行文件、shell 内置命令还是别名。
apropos network apropos file help cd help -d cd
-
学会使用 > 和 < 来重定向输出和输入,学会使用 | 来重定向管道。明白 > 会覆盖了输出文件而 >> 是在文件末添加。了解标准输出 stdout 和标准错误 stderr。
echo "Line 1" > example.txt echo "Line 2" >> example.txt echo "Line 3" >> example.txt
- example.txt内容:
Line 1 Line 2 Line 3
- 使用输入重定向和管道读取文件并处理其内容
cat < example.txt | grep "Line" | tee output.txt | wc -l # cat < example.txt 从example.txt中读取内容 # grep "Line":过滤出包含 "Line" 的行。 # tee output.txt:将过滤后的输出同时写入 output.txt 和传递给下一个命令。 # wc -l:计算行数。
>:将命令的输出重定向到文件,覆盖文件内容。
>>:将命令的输出追加到文件末尾。
<:将文件的内容作为命令的输入。
|:将一个命令的输出作为另一个命令的输入。 -
学会使用通配符 * (或许再算上 ? 和 […]) 和引用以及引用中 ’ 和 " 的区别
- * ? […]
# 匹配所有 .txt 文件 ls *.txt # 匹配名称中只有一个字符不同的文件,如 a.txt, b.txt ls ?.txt # 匹配名称中只有一个字符不同的文件,如 a.txt, b.txt ls ?.txt
- 引用
# 输出 $VAR 而不是变量的值 VAR="world" echo 'Hello $VAR' # Hello $VAR # 输出 Hello world VAR="world" echo "Hello $VAR" # 计算以 file 开头的 .txt 文件的数量 COUNT=$(ls file*.txt | wc -l) echo "Number of files: $COUNT"
-
熟悉 Bash 中的任务管理工具:&,ctrl-z,ctrl-c,jobs,fg,bg,kill 等
# 后台运行一个长时间执行的任务(示例中使用 sleep 模拟) sleep 60 & # 查看当前后台任务 jobs # [1]+ Running sleep 60 & # 将后台任务切换到前台 fg # 终止后台任务 kill %1 # 或者首先获取进程的 PID pidof sleep # 假设输出 PID 为 107829,然后使用 kill 终止该进程 kill 107829 # 运行一个长时间执行的任务(示例中使用 sleep 模拟) sleep 60 # 将暂停的任务切换到后台继续执行 bg # 使用 ctrl-z 暂停任务 # 使用 ctrl-c 终止任务
-
学会基本的文件管理工具:ls 和 ls -l (了解 ls -l 中每一列代表的意义),less,head,tail 和 tail -f (甚至 less +F),ln 和 ln -s (了解硬链接与软链接的区别),chown,chmod,du (硬盘使用情况概述:du -hs *)。 关于文件系统的管理,学习 df,mount,fdisk,mkfs,lsblk。知道 inode 是什么(与 ls -i 和 df -i 等命令相关)。
- ls -l
ls -l # 详细列出目录内容
示例输出
drwxr-xr-x 2 user group 4096 Jul 9 12:34 directory -rw-r--r-- 1 user group 123 Jul 9 12:34 file.txt
每一列的意义:
文件类型和权限 (drwxr-xr-x): 分为四个部分d、rwx、r-x、r-x rwx:表示文件所有者的对该文件所拥有的权限; r-x:表示文件所属组对该文件所拥有的权限; r-x:表示其他用户对该文件所拥有的权限。 d: 目录 -: 普通文件 权限: r (读), w (写), x (执行) 硬链接数 (2): 指向文件的硬链接数量。 文件所有者 (user). 文件所属组 (group). 文件大小 (4096): 以字节为单位。 修改日期和时间 (Jul 9 12:34). 文件或目录名 (directory, file.txt).
- 其他操作
less file.txt # 分页查看文件内容 head file.txt # 查看文件的前10行 head -n 5 file.txt # 查看文件的前5行 tail file.txt # 查看文件的最后10行 tail -f file.txt # 实时查看文件末尾的内容(常用于日志文件) ln original.txt hardlink.txt # 硬链接 (ln): 创建指向相同文件数据的多个文件名 ln -s original.txt symlink.txt # 软链接 (ln -s): 创建指向原始文件路径的符号链接 # 区别: # 硬链接: 指向相同的 inode,删除其中一个文件不会影响另一个。 # 软链接: 指向文件路径,删除原始文件会导致链接文件无效。 chown user:newgroup file.txt # 更改文件所有者 chmod 755 script.sh # 更改文件权限 # 1:读 2:写 3:执行 7 = 1 + 2 + 3即rwx df -h # 查看文件系统的磁盘空间使用情况 mount /dev/sda1 /mnt # 挂载文件系统 sudo fdisk /dev/sda # 磁盘分区工具
-
熟悉正则表达式,学会使用 grep/egrep,和的参数中 -i,-o,-v,-A,-B 和 -C
- 正则表达式
- .: 匹配任意单个字符。
- *: 匹配前面的元素0次或多次。
- +: 匹配前面的元素1次或多次。
- ?: 匹配前面的元素0次或1次。
- []: 匹配括号内的任意一个字符。
- |: 或操作符。
- ^: 匹配行的开头。
- $: 匹配行的结尾。
- : 转义字符,用于匹配特殊字符。
更多资料
- grep/egrep
# -i: 忽略大小写。 grep -i "pattern" file.txt # -o: 仅输出匹配的部分,而不是整行。 grep -o "pattern" file.txt # -v: 反向匹配,显示不包含模式的行。 grep -v "pattern" file.txt # -A: 附加参数,显示匹配行以及其后的指定行数。 grep -A 2 "pattern" file.txt # -B: 附加参数,显示匹配行以及其前的指定行数。 grep -B 2 "pattern" file.txt # -C: 附加参数,显示匹配行以及其前后的指定行数。 grep -C 2 "pattern" file.txt
- 正则表达式
-
学会使用xargs
xargs 是一个强大的命令行工具,用于将输入作为参数传递给另一个命令。它可以处理来自标准输入或文件的输入,并将其逐行或按其他方式传递给指定的命令。# 删除file1.txt file2.txt file3.txt echo file1.txt file2.txt file3.txt | xargs rm # 从 files.txt 中读取文件名并删除这些文件 cat files.txt | xargs rm # -I 选项允许你指定一个替换字符串,xargs 会将其替换为输入的每一行 echo file1.txt file2.txt file3.txt | xargs -I {} mv {} {}.bak # -n 选项允许你指定每次传递给命令的最大参数个数 # file1.txt file2.txt # file3.txt echo file1.txt file2.txt file3.txt | xargs -n 2 echo # -p 选项用于提示用户确认每个命令 echo file1.txt file2.txt file3.txt | xargs -p rm # -0 选项用于处理以空字符(null)分隔的输入,通常与 find 命令结合使用 find . -type f -print0 | xargs -0 rm
综合案例
# 创建一些示例文件和目录 touch file1.txt file2.txt file3.txt mkdir dir1 dir2 # 查找所有文件并备份 find . -type f -print0 | xargs -0 -I {} cp {} {}.bak # 查找所有目录并备份 find . -type d -print0 | xargs -0 -I {} cp -r {} {}_bak # 查找所有文件并删除 find . -type f -print0 | xargs -0 rm # 查找所有目录并删除 find . -type d -print0 | xargs -0 rmdir
-
了解 Bash 中的“here documents”,例如 cat <<EOF …
在 Bash 中,“here documents” 是一种多行字符串输入的方式,可以用于重定向输入到命令中。常见的语法是 <<EOF。cat <<EOF This is a line. This is another line. EOF # 这个命令会将多行字符串作为输入传递给 cat 命令,并输出到终端
-
示例 1:创建一个文件
使用 “here document” 创建并写入文件内容。cat <<EOF > myfile.txt This is the first line. This is the second line. EOF 这会将多行字符串写入 myfile.txt 文件。
-
示例 2:传递多行输入给命令
将多行字符串传递给 grep 命令进行搜索。grep "pattern" <<EOF This is a line with pattern. This is another line. EOF # 输出:This is a line with pattern.
-
示例 3:使用变量和命令替换
使用双引号 " 来启用变量和命令替换。name="World" date=$(date) cat <<EOF Hello, $name! Today's date is: $date EOF # 输出:Hello, World! # Today's date is: Mon Jul 10 10:00:00 UTC 2024
-
-
学会使用cut
cut 命令用于从文件或标准输入中提取指定部分的文本。
常用选项包括:
-c:按字符提取。
-d:指定字段分隔符(默认为制表符)。
-f:指定提取的字段。
假设有一个名为 example.txt 的文件,内容如下:1,John,Doe,25 2,Jane,Smith,30 3,Bob,Johnson,22 4,Alice,Williams,28
# 提取每行的前两个字符 cut -c 1-2 example.txt # 1, 2, ... # 提取第一个字段(假设逗号 , 为分隔符) cut -d ',' -f 1 example.txt # 1 2 ... # 提取从第二个字段到最后一个字段 cut -d ',' -f 2- example.txt # John,Doe,25 ...
更多管道命令【Linux】管道命令