目录
文件批量重命名
题目:编写一个Shell脚本,实现将当前目录下所有以 .jpg
结尾的文件批量重命名,要求在每个文件名前加上指定的前缀,并输出重命名成功的文件数。
提示:
- 使用循环遍历当前目录下的所有
.jpg
文件。 - 对每个文件生成新的文件名,形如
prefix_filename.jpg
。 - 使用
mv
命令进行文件重命名操作。 - 最后输出成功重命名的文件数。
# 示例答案一(不输出文件数)
#!/bin/bash
# 获取当前目录下所有以 .jpg 结尾的文件
for file in *.jpg; do # for in ;do done循环,分号或换行啊;注意规范缩进,多注释
# 生成新的文件名
newname="prefix_$file" # 一定要记住$使用变量
# 重命名文件
mv "$file" "$newname"
# 是mv可不是rm,想想两者分别啥意思,回忆一下选项
# mv是移动文件文件夹,但是如果目标文件不在的话,则“改名”效果
done
echo "Files renamed successfully."
# 示例答案二(输出文件数)
#!/bin/bash
count=0
# 获取当前目录下所有以 .jpg 结尾的文件
for file in *.jpg; do
# 生成新的文件名
newname="prefix_$file"
# 重命名文件
mv "$file" "$newname"
# $?是一个特殊变量,存储了上一个命令的退出状态码。
# 退出状态码为0表示命令成功执行,如果不为0则表示命令执行失败。
if [[ $? -eq 0 ]]; then
echo "Renamed $file to $newname"
((count++))
else
echo "Failed to rename $file"
fi
# 以上六行也可以写为
# mv "$file" "$newname"&&((count++))
done
echo "Files renamed successfully. Total files renamed: $count"
系统资源管理
题目:编写一个Shell脚本,监控并输出当前系统的CPU和内存使用情况
具体要求如下:
- 使用
top
命令获取当前系统的CPU使用情况,并输出为百分比。 - 使用
free
命令获取当前系统的内存使用情况,并输出为百分比。 - 最后输出CPU和内存使用情况的百分比值。
提示:
- 可以使用
grep
和awk
命令来提取和计算所需的数据。 - 使用
printf
格式化输出结果。
#!/bin/bash
# 获取当前系统的CPU和内存使用情况
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
mem_usage=$(free | awk '/Mem/{printf("%.2f"), $3/$2 * 100}')
echo "CPU Usage: $cpu_usage%"
echo "Memory Usage: $mem_usage%"
top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}
top -bn1 top命令实时显示系统信息(进程CPU内存...)-b批处理 n1运行一次退出 grep "Cpu(s)" 从
top
命令的输出中提取包含CPU使用情况的行。grep搜索文本 Cpu(s)搜索模式
sed "s/.*, *\([0-9.]*\)%* id.*/\1/" 提取出CPU空闲百分比。
awk '{print 100 - $1} 计算并打印CPU使用百分比。
计算100减去sed中打印的值$1(表示第一列),并打印结果
free | awk '/Mem/{printf("%.2f"), $3/$2 * 100}'
free free命令显示系统内存的使用情况,包括总内存、已用内存、空闲内存等。
awk '/Mem/ {...}
'对包含 Mem
的行进行处理。{printf("%.2f"), $3/$2 * 100} 计算已用内存占总内存的百分比,并格式化为保留两位小数。
$3
:表示第三列(即已用内存)。
$2
:表示第二列(即总内存)。
问题:
- 该脚本是如何计算CPU使用情况的?
sed
和awk
命令在脚本中分别起到了什么作用?- 该脚本是如何计算内存使用情况的?
- 请解释
free
命令输出的内存信息是如何被处理并计算成百分比的。
答案:
- 该脚本通过
top
命令获取CPU空闲百分比,然后用100减去该值来计算CPU使用百分比。 sed
命令用于从top
命令的输出中提取出CPU空闲百分比,awk
命令则用于计算使用百分比(100 - 空闲百分比)。- 该脚本通过
free
命令获取总内存和已用内存,然后计算内存使用百分比(已用内存 / 总内存 * 100)。 free
命令输出内存信息,awk
命令从中提取出总内存和已用内存,并计算成百分比输出。
日志分析统计
题目:编写一个Shell脚本,统计Web服务器日志文件中不同IP地址的访问次数,并按访问次数从高到低排序输出。要求脚本读取一个指定的日志文件,并输出格式化的结果。
要求:
- 脚本读取指定的日志文件(假设文件名为
access.log
)。 - 提取日志文件中的IP地址。
- 统计每个IP地址的访问次数。
- 按访问次数从高到低排序。
- 格式化输出结果,显示IP地址及其对应的访问次数。
#!/bin/bash
# 统计日志中不同IP的访问次数
logfile="access.log" #指定日志文件名
echo "IP Address Requests"
echo "====================="
awk '{print $1}' "$logfile" | sort | uniq -c | sort -nr | while read count ip; do
printf "%-15s %7d\n" "$ip" $count
done
# awk '{print $1}' "$logfile" 提取日志文件第一列;
# 加上双引号可以避免文件名中出现空格或特殊字符的影响(不加会将其解释为多个参数)
# sort:对IP地址进行排序。
# uniq -c:统计每个唯一IP地址的出现次数。
# sort -nr:按统计次数从高到低排序。-n按数值顺序排序;-r按逆序排序
# while read count ip; do ... done:读取排序后的统计结果,并格式化输出。
# count 和 ip 是在 read 命令中定义的变量。它们的作用域仅限于 while 循环体内。
# printf "%-15s %7d\n" "$ip" $count:格式化输出IP地址及其访问次数。
# "%-15s %7d\n":这是格式字符串,指定了输出格式。
# %-15s:表示一个左对齐的字符串,占15个字符宽度。
# %s:表示格式化输出为字符串。
# -:表示左对齐(默认是右对齐)。
# 15:表示字段宽度为15个字符。
# %7d:表示一个右对齐的整数,占7个字符宽度。
# %d:表示格式化输出为整数。
# 7:表示字段宽度为7个字符。
-
访问日志(Access Logs):
- 默认位置:
/var/log/apache2/access.log
或/var/log/httpd/access_log
- 描述:记录所有访问服务器的请求信息,包括访问者的IP地址、访问时间、请求的URL、HTTP状态码等。
- 默认位置:
定时任务管理
题目:编写一个改进版本的Shell脚本,以完成每天定时备份数据库的任务,并加入以下功能:
-
备份文件管理:每次备份前,检查备份目录是否存在,不存在则创建。检查当天的备份文件是否已存在,如果存在则给出警告或覆盖旧文件。
-
日志记录:将备份操作的结果和详细信息记录到日志文件中,包括备份成功与否、备份文件路径等。
-
错误处理:在发生错误时能够输出详细的错误信息,并记录到日志中。
-
可配置性:将备份目录、数据库连接信息等参数作为脚本的输入参数或配置项,增强脚本的灵活性和通用性。
要求和提示:
- 使用Shell脚本语言编写,确保脚本能够在Linux环境下运行。
- 脚本应能自动创建备份目录,检查并管理备份文件。
- 使用合适的日期格式化来生成备份文件名,避免重复备份同一天的文件。
- 考虑在日志文件中记录脚本运行的详细过程,包括备份成功或失败的信息。
- 使用条件判断结构来处理备份成功或失败的情况,并输出相应的信息。
- 考虑使用函数来组织和模块化代码,提高脚本的可读性和维护性。
#基础版
#!/bin/bash
# 每天定时备份数据库
backup_dir="/path/to/backup"
backup_file="$backup_dir/db_backup_$(date +%Y%m%d).sql"
# date +格式化字符串
# 使用 pg_dump 备份数据库
pg_dump -h localhost -U username dbname > "$backup_file"
# pg_dump 是 PostgreSQL 数据库自带的一个备份工具
# 用于将 PostgreSQL 数据库中的数据和对象导出到一个文件中,以便后续进行恢复或迁移。
# -h localhost:指定数据库服务器的主机名或IP地址。
# -U username:指定连接数据库的用户名。
# dbname:要备份的数据库名。
# > "$backup_file":将备份内容输出到 backup_file 文件中。
if [[ $? -eq 0 ]]; then
echo "Database backup successfully created: $backup_file"
else
echo "Error creating database backup."
fi
# 改进版
#!/bin/bash
# 备份目录和文件
backup_dir="/path/to/backup"
backup_file="$backup_dir/db_backup_$(date +%Y%m%d).sql"
log_file="/path/to/backup_log.txt"
# 创建备份目录
if [[ ! -d "$backup_dir" ]]; then
mkdir -p "$backup_dir"
echo "Created backup directory: $backup_dir" >> "$log_file"
fi
# ! 表示逻辑非,-d "$backup_dir" 表示检查 $backup_dir 是否存在并且是一个目录。
# 检查当天备份文件是否存在
if [[ -f "$backup_file" ]]; then
echo "Warning: Backup file already exists for today." >> "$log_file"
fi
#-f 只能用于检查文件是否存在并且是一个常规文件,-d(检查是否是目录)-e(检查是否存在)
# 使用 pg_dump 备份数据库
pg_dump -h localhost -U username dbname > "$backup_file" 2>> "$log_file"
# 检查备份是否成功
if [[ $? -eq 0 ]]; then
echo "$(date): Database backup successfully created: $backup_file" >> "$log_file"
else
echo "$(date): Error creating database backup." >> "$log_file"
fi
# 结束日志记录
echo "Backup process completed." >> "$log_file"
数据库查询与操作
题目:查询并显示数据库中所有状态为 'active' 的用户信息。向数据库中插入一个新用户记录。
#!/bin/bash
# 查询并显示数据库中的活跃用户
query="SELECT * FROM users WHERE status='active';"
psql -h localhost -U username dbname -c "$query"
# -h hostname:指定连接的主机名。
# -U username:指定连接的用户名。
# dbname:指定连接的数据库名。
# 向数据库插入新用户
new_user="INSERT INTO users (name, email, status) VALUES ('John Doe', 'john.doe@example.com', 'active');"
psql -h localhost -U username dbname -c "$new_user"
文件的备份与压缩
题目:编写一个Shell脚本,实现以下操作:
- 备份指定目录下的文件。
- 将备份文件压缩为
tar.gz
格式。
#!/bin/bash
# 备份指定目录下的文件,并压缩为tar.gz格式
backup_dir="/path/to/data"
backup_file="backup_$(date +%Y%m%d).tar.gz" #备份文件名,使用当前日期作为文件名的一部分
#使用 tar 命令将指定目录 $backup_dir 下的文件打包并压缩为 tar.gz 格式的文件 $backup_file
tar -czf "$backup_file" "$backup_dir"
# -c 创建压缩文件
# -z gzip模式
# -f 创建的文件
# 检查备份和压缩是否成功
if [[ $? -eq 0 ]]; then #退出状态码是否为0
echo "Backup successfully created: $backup_file"
else
echo "Error creating backup."
fi
自动化部署脚本
题目:编写一个Shell脚本,实现以下操作:
- 将本地的Web应用程序文件(如
app.war
)部署到远程服务器。 - 在远程服务器上解压部署文件,并重启应用服务器(假设使用
systemctl
重启tomcat
)。
#!/bin/bash
# 自动化部署Web应用程序到远程服务器
remote_host="username@hostname" # 远程服务器的用户名和主机名。
remote_dir="/path/to/deploy" # 远程服务器上的目标部署目录。
local_war="app.war" # 本地的Web应用程序文件
echo "Deploying application to $remote_host:$remote_dir ..."
# 使用 scp 命令将本地的应用程序文件复制到远程服务器的指定目录。
scp "$local_war" "$remote_host:$remote_dir"
# 使用 ssh 连接到远程服务器,执行在远程服务器上解压应用程序文件并重启 tomcat 服务器的命令序列。
ssh "$remote_host" "cd $remote_dir && tar -xf $local_war && systemctl restart tomcat"
# 检查部署操作的执行状态
if [[ $? -eq 0 ]]; then
echo "Deployment successful."
else
echo "Deployment failed."
fi
简单的用户管理脚本
题目:编写一个Shell脚本,实现简单的用户管理功能,包括添加和删除用户操作。
要求:
- 功能选择:脚本首先显示功能菜单;提示用户输入选择(
1
或2
) - 添加用户操作:如果用户选择
1
,提示用户输入要添加的用户名。 - 删除用户操作:如果用户选择
2
,提示用户输入要删除的用户名。 - 错误处理:对于无效的选择(不是
1
或2
),输出提示信息并结束脚本运行。
#!/bin/bash
# 简单的用户管理脚本,添加和删除用户
echo "Choose an action:"
echo "1. Add User"
echo "2. Delete User"
read choice
case $choice in
1)
echo "Enter username to add:"
read username
useradd "$username"
if [[ $? -eq 0 ]]; then
echo "User $username added successfully."
else
echo "Failed to add user."
fi
;;
2)
echo "Enter username to delete:"
read username
userdel "$username"
if [[ $? -eq 0 ]]; then
echo "User $username deleted successfully."
else
echo "Failed to delete user."
fi
;;
*)
echo "Invalid choice."
;;
esac
注意权限 | ![]() |
系统监控与报警
题目:编写一个Shell脚本,实现以下操作:
-
监控系统资源:使用命令获取当前系统的CPU使用情况。如果CPU使用率超过指定阈值(例如90%),则触发邮件报警。
-
发送邮件报警:如果CPU使用率超过阈值,使用
mail
命令向指定的管理员邮箱发送报警邮件。邮件主题为 "High CPU Usage Alert",内容包含当前CPU使用率信息。
要求:
-
获取CPU使用率:使用
top
命令结合grep
、sed
和awk
等工具获取CPU使用率,并进行计算。 -
报警条件:如果计算得到的CPU使用率超过预设的阈值(例如90%),则触发报警。
-
发送邮件:使用
mail
命令发送邮件给管理员,包括当前CPU使用率信息。
#!/bin/bash
# 监控系统资源使用情况,并发送邮件报警
threshold=90 # 设置CPU使用率的阈值为90%。
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
# 第二题中出现。grep、sed 和 awk 结合,从输出中提取并计算CPU空闲百分比。
# 使用 bc 计算判断CPU使用率是否超过阈值。
if [[ $(echo "$cpu_usage > $threshold" | bc -l) -eq 1 ]]; then
echo "High CPU usage detected: $cpu_usage%"
# 如果CPU使用率超过阈值,使用 mail 命令发送邮件给 admin@example.com。
mail -s "High CPU Usage Alert" admin@example.com <<< "Current CPU Usage: $cpu_usage%"
else
echo "CPU usage within normal range: $cpu_usage%"
fi
数据分析与报告生成
题目:编写一个Shell脚本,统计指定日志文件中访问量最高的页面(URL)。
要求:
- 日志文件:日志文件路径为
access.log
。 - 统计逻辑:从日志文件中提取页面(URL)信息,一般在日志中为第7列;使用
awk
命令提取页面信息,并结合sort
、uniq -c
、sort -nr
和head -n 10
实现统计;输出按访问量降序排列的前10个页面及其访问次数。
#!/bin/bash
# 统计日志中访问量最高的页面
logfile="access.log"
echo "Top 10 Pages by Access Count:"
echo "============================="
awk '{print $7}' "$logfile" | sort | uniq -c | sort -nr | head -n 10 | while read count page; do
printf "%-10s %s\n" "$count" "$page" #输出格式要求
done
# awk '{print $7}' "$logfile":提取日志文件中第7列的页面信息(假设页面URL在第7列)。
# sort:排序页面信息。
# uniq -c:统计每个页面出现的次数。
# sort -nr:按访问次数逆序排序。
# head -n 10:取前10条结果。
# 变量 count 存储访问次数
# 变量 page 存储页面URL。
未完待续,2024/7/18留