shell 编程(五)

shell 环境的配置文件

df 命令

df 命令时unix 和类unix系统中用于显示文件系统磁盘空间使用情况的命令,df 是disk free的缩写,它可以显示磁盘上每个挂载点的使用情况,包括总容量,已用空间,可用空间以及挂载点信息。

基本语法

df [选项] [文件或目录]

常用选项

-h: 以可读性更高的方式显示( 例如KB、MB、GB等)

-T: 显示文件系统类型

-i: 显示inode 使用情况,而不是磁盘空间

-a: 显示所有文件系统,包括虚拟文件系统

-l: 仅显示本地文件系统

-t <type>: 仅显示特定类型的文件系统
查找df 命令下以/dev 开头的磁盘的使用率

df | grep "^/dev/" | tr -s " " % | cut -d % -f5

root@qgy-VMware-Virtual-Platform:~# df

Filesystem 1K-blocks Used Available Use% Mounted on

tmpfs 808364 2288 806076 1% /run

/dev/sda2 102623160 22773396 74590656 24% /

tmpfs 4041816 0 4041816 0% /dev/shm

tmpfs 5120 8 5112 1% /run/lock

tmpfs 808360 128 808232 1% /run/user/1000

/dev/sr0 6057964 6057964 0 100% /media/qgy/Ubuntu 24.04.1 LTS amd64

tmpfs 808360 80 808280 1% /run/user/0

root@qgy-VMware-Virtual-Platform:~# df | grep '^/dev' | tr -s " " % | cut -d % -f5

24

100

编写一个脚本,当内存的利用率超过80%发送警告邮件

#!/bin/bash

获取当前根文件系统的使用率

USAGE=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')

设置警告阈值

WARNING=80

if [ $USAGE -gt $WARNING ]; then

echo "Disk usage is above $WARNING%. Current usage is ${USAGE}%." | mail -s "Disk Usage Warning" admin@example.com

fi
USAGE=`df /| grep /| awk '{ print $5 }' | sed 's/%//g'`
/dev/zero是一个特殊的设备文件,在unix和类unix系统中,它提供一个无限流的零字节(0x00),也就是说任何读取/dev/zero 的操作都会返回连续的零字节

主要用途

1、生成零填充数据: 通过读取/dev/zero 可以轻松地生成一段零字节的数据,通常用于测试、文件初始化或清除数据

2、测试磁盘性能: 常用于创建零填充的文件或设备来测试磁盘的写入性能

3、创建空白文件: 可以使用它来快速创建具有特定大小的空白文件(文件内容是零)

示例:

cat /dev/zero

创建一个大小为100MB的文件,其中的内容全部为零

dd if=/dev/zero of = zero_file.bin bs=1M count=100

创建一个空的交换文件

在 Linux 系统中,可以使用 /dev/zero 创建一个交换文件(swap file),然后格式化为交换空间:

dd if=/dev/zero of=/swapfile bs=1M count=1024 mkswap /swapfile swapon /swapfile

  • 这将创建一个 1GB 的交换文件(/swapfile),并将其启用为交换空间。

填充磁盘或分区

你也可以使用 /dev/zero 来清空文件系统或分区,确保其中的数据被零填充。例如,清空一个硬盘分区:

dd if=/dev/zero of=/dev/sda bs=1M

  • 这会将整个硬盘 /dev/sda 用零填充,通常用于彻底擦除磁盘数据。但要小心,这样的操作会导致磁盘上的所有数据丢失。

测试磁盘写入性能

你可以用 /dev/zero 来测试磁盘的写入性能,例如创建一个大的文件:

dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct

  • 这条命令会向 testfile 写入 1GB 的零字节数据,并且使用 oflag=direct 选项避免使用缓存,从而更准确地测试磁盘性能。
    dd 命令

dd 是 Unix 和 Linux 系统中用于低级别复制和转换数据的命令。它通常用于备份、创建磁盘镜像、复制数据、生成随机数据以及转换文件格式等。

基本语法:

dd if=<输入文件> of=<输出文件> [选项]

  • if=<输入文件>:指定输入文件(input file),即你要复制的数据源。如果没有指定,则默认是标准输入(stdin)。
  • of=<输出文件>:指定输出文件(output file),即你要复制到的位置。如果没有指定,则默认是标准输出(stdout)。

常见选项:

  • bs=<块大小>:指定读写的块大小,通常以字节为单位。可以设置为 512、1024、2048、4096 字节等。使用较大的块大小可以提高效率。
  • count=<块数>:指定复制的块数。count 代表从输入文件读取的块数,限制了复制的总量。
  • skip=<块数>:指定在输入文件开始复制之前跳过的块数。常用于从某个位置开始复制数据。
  • seek=<块数>:指定在输出文件中开始写入的位置(跳过指定数量的块)。
  • conv=<选项>:转换文件内容。常用的选项包括:
    • noerror:即使读取错误也继续。
    • sync:将输入块填充到指定块大小,确保每个块都完整。
    • notrunc:不截断输出文件。
    • ebcdic:转换输入文件为 EBCDIC 编码。

示例:

  1. 创建一个文件的镜像

将整个磁盘(如 /dev/sda)复制到一个文件中(如 backup.img):

dd if=/dev/sda of=backup.img bs=64K

  • if=/dev/sda:指定输入文件为 /dev/sda(磁盘设备)。
  • of=backup.img:输出文件为 backup.img
  • bs=64K:设置块大小为 64KB,通常较大的块大小能够提高复制效率。
  1. 创建一个文件的备份

将一个普通文件(如 data.txt)复制到一个新文件(如 data_backup.txt):

dd if=data.txt of=data_backup.txt bs=4K

  • if=data.txt:指定输入文件为 data.txt
  • of=data_backup.txt:指定输出文件为 data_backup.txt
  • bs=4K:每次读写 4KB 数据。
  1. 创建磁盘的镜像备份并压缩

可以将磁盘内容通过 dd 命令创建镜像,并直接通过管道将其压缩:

dd if=/dev/sda | gzip > backup.img.gz

  • 这条命令将磁盘 /dev/sda 的数据通过 dd 命令复制并压缩成 backup.img.gz 文件。
  1. 备份整个硬盘的第一个分区(如 /dev/sda1)到文件

dd if=/dev/sda1 of=/backup/sda1.img bs=4M

  • 这将会从 /dev/sda1 读取数据,并将其保存为 sda1.img
  1. 复制硬盘并调整分区

你可以使用 dd 复制一个硬盘的整个内容(包括分区表),例如将 /dev/sda 的内容复制到 /dev/sdb

dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync

  • conv=noerror,sync:即使遇到读错误也继续复制,并将输入块填充到指定大小。
  1. 从ISO文件中创建启动盘

将一个 ISO 文件写入 USB 设备或 SD 卡(如 /dev/sdb):

dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress

  • if=ubuntu.iso:输入文件为 Ubuntu 镜像文件。
  • of=/dev/sdb:将镜像写入到 USB 设备 /dev/sdb
  • status=progress:显示命令的执行进度。
  1. 检查磁盘的读取速度

使用 dd 测试磁盘的读取性能:

dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct

  • 这条命令会从 /dev/zero(一个虚拟的零设备)读取数据,写入到 testfile 文件中,测试磁盘的写入速度。
  • bs=1M:每次写入 1MB 数据。
  • count=1024:写入 1024 个块(即 1GB)。
  • oflag=direct:直接使用磁盘 I/O,避免缓存。

注意事项:

  1. dd 命令的危险性 :因为 dd 是低级别的文件复制工具,它没有检查文件类型的功能。所以在操作磁盘或设备时要非常小心,错误的 ifof 参数可能会导致数据丢失。使用前务必确认目标文件或设备。

  2. 进度显示 :如果你在执行 dd 时需要查看进度,可以使用 status=progress 来显示命令执行的进度信息。例如:

    dd if=/dev/sda of=backup.img bs=64K status=progress

  3. 备份和恢复dd 是非常强大的工具,适用于磁盘、分区级别的备份和恢复。

总结:

  • dd 是一个强大的工具,适用于处理低级数据复制、备份、磁盘镜像等任务。
  • 需要小心使用,因为它会直接读取和写入设备数据,没有文件系统层面的保护,错误操作可能导致数据丢失。
grep 命令

grep 是一个在 Unix 和类 Unix 系统中广泛使用的命令行工具,用于从输入中查找与指定模式(通常是正则表达式)匹配的行。它的名字来自 "Global Regular Expression Print",即全局正则表达式打印。

基本语法:

grep [选项] '模式' [文件...]

  • '模式':要匹配的正则表达式或字符串。

  • [文件...]:要搜索的一个或多个文件。如果不指定文件,grep 会从标准输入(通常是终端或管道)中读取数据。

常见选项:

  1. -i:忽略大小写匹配。

    • grep -i 'pattern' file:匹配不区分大小写的模式。
  2. -v:反向匹配(invert match),显示不包含指定模式的行。

    • grep -v 'pattern' file:显示不包含模式 pattern 的行。
  3. -r-R:递归地搜索目录中的文件。

    • grep -r 'pattern' /path/to/dir:递归地在 /path/to/dir 目录下的所有文件中查找匹配的内容。
  4. -l:仅显示包含匹配模式的文件名。

    • grep -l 'pattern' file1 file2:列出包含匹配模式的文件名。
  5. -L:仅显示不包含匹配模式的文件名。

    • grep -L 'pattern' file1 file2:列出不包含匹配模式的文件名。
  6. -n:显示匹配行的行号。

    • grep -n 'pattern' file:显示匹配的行以及行号。
  7. -H:显示匹配行的文件名。

    • grep -H 'pattern' file:显示匹配的行及文件名。
  8. -c:只显示匹配模式的行数。

    • grep -c 'pattern' file:显示文件中匹配的行数。
  9. -w:匹配整个单词,避免部分匹配。

    • grep -w 'pattern' file:只匹配包含 pattern 的单独单词。
  10. -x:匹配整行。

    • grep -x 'pattern' file:仅匹配完全与模式 pattern 相等的行。
  11. -A <num> :显示匹配行及其后面的 <num> 行。

    • grep -A 3 'pattern' file:显示匹配行以及接下来的 3 行。
  12. -B <num> :显示匹配行及其前面的 <num> 行。

    • grep -B 3 'pattern' file:显示匹配行以及前面的 3 行。
  13. -C <num> :显示匹配行及其前后 <num> 行。

    • grep -C 3 'pattern' file:显示匹配行以及前后各 3 行。

使用示例:

  1. 搜索一个文件中的字符串

查找文件 file.txt 中是否包含字符串 hello

grep 'hello' file.txt

  1. 忽略大小写的搜索

查找文件 file.txt 中的 hello,不区分大小写:

grep -i 'hello' file.txt

  1. 反向匹配

查找文件 file.txt 中不包含 hello 的行:

grep -v 'hello' file.txt

  1. 递归搜索目录中的文件

递归地在目录 /home/user/ 下查找包含 pattern 的文件:

grep -r 'pattern' /home/user/

  1. 显示行号

查找文件 file.txt 中包含 hello 的行并显示行号:

grep -n 'hello' file.txt

  1. 显示匹配的文件名

查找多个文件中包含 pattern 的文件名:

grep -l 'pattern' file1.txt file2.txt

  1. 匹配整个单词

查找文件 file.txt 中完全匹配 hello 的行,而不是包含 hello 的部分匹配:

grep -w 'hello' file.txt

  1. 显示匹配行及其前后 2 行

查找 pattern 并显示匹配行及其前后各 2 行:

grep -C 2 'pattern' file.txt

  1. 查找多行匹配模式并显示行数

查找文件 file.txt 中包含 pattern 的行数:

grep -c 'pattern' file.txt

  1. 显示所有包含匹配模式的行和文件名

查找当前目录及子目录下的所有 .txt 文件中包含 pattern 的行,并显示文件名:

grep -H 'pattern' *.txt

正则表达式支持:

grep 支持强大的正则表达式功能,使得它可以匹配复杂的模式。基本正则表达式(BRE)和扩展正则表达式(ERE)都可以在 grep 中使用:

  • 基本正则表达式(BRE)grep 默认使用基本正则表达式。

  • 扩展正则表达式(ERE) :使用 grep -E 来启用扩展正则表达式(如 +?| 等特殊字符)。

例如,使用扩展正则表达式(ERE)查找包含 catdog 的行:

grep -E 'cat|dog' file.txt

总结:

  • grep 是一个功能强大的文本搜索工具,广泛应用于日志文件分析、文本处理、系统管理等场景。

  • 它通过模式匹配(通常是正则表达式)帮助用户快速查找文件中的相关信息。

  • 常见选项包括 -i(忽略大小写)、-v(反向匹配)、-r(递归搜索)等,能满足不同的搜索需求。

使用read 命令来接受输入

使用read来把输入值分配给一个或多个shell变量,read 从标准输入中读取值,给每个单词分配一个变量,把所有剩余单词都分配给最后一个变量

格式:

read [option] [name ...]

常见选项:

-p 指定要显示的提示

-s 静默输入,一般用于密码

-n N 指定输入的字符长度N

-d '字符' 输入结束符

-t N TIMEOUT 为N 秒

范例:

read -p "Enter a filename: " FILE

read # 如果没有提供变量 系统默认将输入赋值给$REPLY

echo $REPLY
| 管道会导致重新开启一个子shell ,左右两边的命令将在子shell 中运行

echo nick | read NAME // 在子shell 中运行 将nick 赋值给NAME 子shell 运行完即结束

echo $NAME // 输出的是父shell 中的NAME变量的值
更改密码:

echo pass | passwd --stdin wang 这个命令在 Linux 系统中用于通过标准输入(stdin)为用户 wang 设置密码。

如果不支持 --stdin

echo "wang:pass" | chpasswd

bash 的配置文件

bash shell 的配置文件很多,可以分成下面类别

按生成范围划分为两类

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

shell 用户登录的两种分类方式

交互式登录:

(1)直接通过终端输入账号密码登录

(2)使用"su - UserName" 切换用户

配置文件的执行顺序:

/etc/profile ----> /etc/profile.d/*.sh -----> ~/.bash_profile -----> ~/.bashrc --->/etc/bashrc

非交互式登录:

(1) su UserName

(2) 图形界面下打开的终端

(3) 执行脚本

(4) 任何其他的bash 实例

执行顺序

/etc/profile.d/*.sh ---> /etc/bashrc ---->~/.bashrc

按功能划分分类

profile类和bashrc类

profile 类

profile 类为交互式登录的shell提供配置

全局: /etc/profile, /etc/profile.d/*.sh

个人: ~/.bash_profile

功能:

(1) 用于定义环境变量

(2) 运行命令或脚本

bashrc 类 run commmand

bashrc 类: 为非交互式和交互式登录的shell提供配置

全局: /etc/bashrc

个人: ~/.bashrc

功能:

(1) 定义命令别名和函数

(2) 定义本地变量

编辑配置文件生效

修改profile和bashrc文件后需要生效的两种方法

1、重新启动shell 进程

2、source |. 配置文件

范例:

~/.bashrc

Bash 退出任务

保存在~//bash_logout 文件中(用户),在退出登录shell 时运行

功能:

创建自动备份

清除临时文件

相关推荐
木卫二号Coding2 分钟前
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
linux·ubuntu·docker
IT 古月方源26 分钟前
ospf 的 状态机详解
运维·网络·tcp/ip·智能路由器
九河云35 分钟前
Amazon Bedrock Claude 3 在客户服务自动化中的应用方法
运维·人工智能·自动化·aws
hc_bmxxf37 分钟前
Linux应用软件编程-多任务处理(进程)
linux·运维·服务器
M-C-B1 小时前
配置带外与更改密码
运维·服务器
沐多1 小时前
波折重重:一个Linux实时系统Xenomai宕机问题的深度定位过程
linux·xenomai·实时linux·xenomai4
猿经验1 小时前
tar.gz压缩文件在linux上解压异常问题:gzip:stdin:invalid compressed data
linux·运维·服务器
木卫二号Coding1 小时前
宝塔-firefox(Docker应用)-构建自己的Web浏览器
linux·docker·开源
dawn1 小时前
通过GRE协议组建VPN网络
运维·网络·vpn·gre
SP八岐大兔2 小时前
Linux(Ubuntu/CentOS)配置开机自启动服务
linux·ubuntu·centos