我可以不吃啊 发表于 2024-7-17 04:44:43

Linux shell脚本100道练习题(每日更新)

1. 创作目的

        为了增强和巩固自身对linux shell脚本的熟悉水平,通过100道练习题强化shell本领,同时分享自己的劳动效果给很多必要提升脚本本领的朋友,大家一起共同进步;
2. 练习题100道合集

2.1 练习题001

   【题目要求】
请生成日期格式为yyyy-MM-dd的日记文件,每日生成一个文件, 比方生成的文件名为2024-04-28.log, 而且把磁盘的使用情况写到到这个文件中,同时将文件放到指定目录中,并删除一年前的日记记录; 不用考虑cron,仅仅写脚本即可
 2.1.1 知识巩固

Date的用法

#打印当前时间
# date
Sun Apr 28 02:51:21 CST 2024
#打印当年年份最后两位
# date +%y
24
#打印当前完整年份
# date +%Y
2024
#打印当月月份
# date +%m
04
#打印当前小时数
# date +%H
02
#打印当前秒数
# date +%s
1714243745
#打印当前分钟的第几秒
# date +%S
11
#打印一个星期的第几天,这里是0,表示星期天
# date +%w
0
#打印今年第几周
# date +%W
17
#打印格式yyy-mm-dd的日期
# date +%F
2024-04-28
#打印当前完整月份
# date +%B
April
#打印当前月份缩写
# date +%b
Apr


df命令的用法

# df -h
Filesystem               SizeUsed Avail Use% Mounted on
devtmpfs               898M   0898M   0% /dev
tmpfs                  910M   0910M   0% /dev/shm
tmpfs                  910M9.7M901M   2% /run
tmpfs                  910M   0910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G2.0G   16G12% /
/dev/sda1               1014M151M864M15% /boot
cm_processes             910M   0910M   0% /run/cloudera-scm-agent/process
tmpfs                  182M   0182M   0% /run/user/0


find命令的用法 后续补充
xargs命令用法后续补充
-mtime命令用法 后续补充 2.1.2 脚本内容

#! /bin/bash

##生成yyyy-mm-dd格式的时间字符串
logname=`date +%F`
#指定日志存放的路径
dir=/opt/logs/disklog

#判断路径是否存在,不存在则创建
if [ ! -d $dir ]
then
      mkdir -p $dir
fi

#将磁盘信息写入日志文件
df -h > $dir/$logname.log

#查询指定目录下修改时间在365天以前的文件,并执行删除
find $dir/ -mtime +365 | xargs rm -f 2.2 练习题002

   【日记格式】
112.111.12.248 – formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”
 2.2.1 知识巩固

awk的用法
可以处理带空格的行数据

awk的使用格式
awk ‘条件1{执行语句1}条件2{执行语句2}条件3{执行语句3}’ filename 条件语句可选(文件名可选)
awk ‘BEGIN{执行语句1}{执行语句2}END{执行语句3}’ filenameBEGIN和END条件语句可选(文件名可选)

#打印磁盘的使用信息
# df -h
Filesystem               SizeUsed Avail Use% Mounted on
devtmpfs               898M   0898M   0% /dev
tmpfs                  910M   0910M   0% /dev/shm
tmpfs                  910M9.6M901M   2% /run
tmpfs                  910M   0910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G2.0G   16G12% /
/dev/sda1               1014M151M864M15% /boot
cm_processes             910M   0910M   0% /run/cloudera-scm-agent/process
tmpfs                  182M   0182M   0% /run/user/0

#打印第二列和第五列的信息
# df -h |awk '{printf $2 "\t" $5 "\n"}'
Size    Use%
898M    0%
910M    0%
910M    2%
910M    0%
17G   12%
1014M   15%
910M    0%
182M    0%

#打印目录的信息
# awk '{print $NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
Management:/:/sbin/nologin
bus:/:/sbin/nologin
polkitd:/:/sbin/nologin
SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
carlos:x:1000:1000:carlos:/home/carlos:/bin/bash
Manager:/var/lib/cloudera-scm-server:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
Daemon:/var/lib/rpcbind:/sbin/nologin

#以:为分隔符,打印目录的信息
# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
# awk '{print $NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
Management:/:/sbin/nologin
bus:/:/sbin/nologin
polkitd:/:/sbin/nologin
SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
carlos:x:1000:1000:carlos:/home/carlos:/bin/bash
Manager:/var/lib/cloudera-scm-server:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
Daemon:/var/lib/rpcbind:/sbin/nologin

#以:为分隔符,打印目录的信息,并去重统计
# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd | uniq -c
      1 /bin/bash
      4 /sbin/nologin
      1 /bin/sync
      1 /sbin/shutdown
      1 /sbin/halt
   11 /sbin/nologin
      1 /bin/bash
      3 /sbin/nologin 2.2.2 脚本内容


#打印1.log日志中第一个参数,即IP地址;
#排序,去重统计出现的次数,即访问数量;
#再次逆序排序,可以查看在最前方统计次数的排序结果
awk '{print $1}' 1.log|sort |uniq -c |sort -n -r 2.3 练习题003

   

写一个脚本盘算一下linux体系所有进程占用内存巨细的和。





[*]ps下令用法
[*]for循环
[*]加法运算
 2.3.1 知识巩固

ps的用法

#显示内存信息(截取部分内容),RSS即内存占用大小
# ps aux
USER      PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          10.00.3 1280086664 ?      Ss   13:04   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          20.00.0      0   0 ?      S    13:04   0:00
root          40.00.0      0   0 ?      S<   13:04   0:00
root          60.00.0      0   0 ?      S    13:04   0:03
root          70.00.0      0   0 ?      S    13:04   0:00
root          80.00.0      0   0 ?      S    13:04   0:00
root          90.00.0      0   0 ?      S    13:04   0:07
root         100.00.0      0   0 ?      S<   13:04   0:00
root         110.00.0      0   0 ?      S    13:04   0:01
root         120.00.0      0   0 ?      S    13:04   0:01
root         130.00.0      0   0 ?      S    13:04   0:00

for循环用法

for n in 范围
do
    表达式
done


free的用法
# free
            total      used      free      sharedbuff/cache   available
Mem:      1863032      344296   1332812      9848      185924   1362948
Swap:       2097148         0   2097148 2.3.2 脚本内容

#! /bin/bash

sum=0
for n in `ps aux | grep -v 'TIME COMMAND' | awk '{print $6}t'`
do
      sum=$[$sum+$n]
done
echo $sum 2.4 备份数据库

   题目要求
计划一个shell脚原来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。
假定,我们知道mysql root账号的暗码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30, 远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup  . 写完脚本后,必要加入到cron中,每天凌晨3点实行。

核心要点
备份数据库的下令
同步到远程去的下令
本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀
 2.4.1 知识巩固

#打印时间
# date +%F
2024-05-01
#打印一周的第几天
# date +%w
3
#打印一个月的第几天
# date +%d
01

#mysql备份脚本语法
mysqldump -u username -p dbname > filename.sql

#恢复脚本
mysql -u root -p < C:\all.sql

#从本地同步远程
# 默认SSH端口
rsync -avz -e ssh /home/bear/mydir root@114.215.183.37:/home/bear/workdir

# 指定SSH端口
rsync -avz -e 'ssh -p 5555' /home/bear/mydir root@114.215.183.37:/home/bear/workdir

#从远程同步到本地
# 默认SSH端口
rsync -avzP -e ssh root@114.215.183.37:/home/bear/workdir /home/bear/mydir

# 指定SSH端口
rsync -avzP -e 'ssh -p 5555' root@114.215.183.37:/home/bear/workdir /home/bear/mydir 2.4.2 脚本内容

#! /bin/bash

#打印本周星期几
d1=`date +%w`
#打印本月的天数
d2=`date +%d`

local_dir=/bak/mysql
remote_dir=192.168.123.30::backup

#mysql备份数据库脚本到本地
mysqldump -uroot -proot discuz > $local_dir/discuz.sql.$d1
#同步到远程
rsync -az $local_dir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2 2.5  监控502

   
题目要求
服务器上跑的是LNMP情况,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为广泛的错误状态码。
由于502只是临时的,而且只要一重启php-fpm服务则502消失,但不重启的话,则会一直连续很长时间。
以是有须要写一个监控脚本,监控访问日记的状态码,一旦发生502,则自动重启一下php-fpm。
我们设定:
1)access_log  /data/log/access.log
2)脚本死循环,每10s检测一次(假设每10s钟的日记条数为300左右)
3)重启php-fpm的方法是  /etc/init.d/php-fpm restart
核心要点
用curl检测状态码是否是502大概通过分析访问日记判断状态码的比率
重启php-fpm服务的下令
2.5.1 知识巩固

#grep的用法
grep pattern

pattern - 表示要查找的字符串或正则表达式。
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。

-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。

# echo "hello world" | grep -c world
1

#在文本中匹配带有error的日志
# grep -i error app.log

#结合tail命令实时查看error日志
# tail -f app.log | grep -i error

# tail -f app.log | grep -A 9 -i error

-A 9: (after)匹配日志后的后9行日志
-B 9: (before)匹配日志后的前9行日志
-C 9: 匹配日志后的前后9行日志

#wc的用法
wc (word count)命令常用于计算文件的行数、字数和字节数

-l , --lines : 显示行数;
-w , --words : 显示字数;
-m , --chars : 显示字符数;
-c , --bytes : 显示字节数;
-L , --max-line-length : 显示最长行的长度

# wc -l /root/shell/sh_008.sh
25 /root/shell/sh_008.sh
# wc /root/shell/sh_008.sh
2559 430 /root/shell/sh_008.sh
# wc -w /root/shell/sh_008.sh
59 /root/shell/sh_008.sh
# wc -m /root/shell/sh_008.sh
422 /root/shell/sh_008.sh
# wc -L /root/shell/sh_008.sh
80 /root/shell/sh_008.sh 2.5.2 脚本内容

#! /bin/bash

#日志存储的位置
log=/data/log/access.log

while :
do
    #从日志中最后300行找到502出现的次数,防止有些数字也有502 需要在前后加上空格
    502_n=`tail -n 300 $log | grep -c ' 502 '`
    #判断502状态码是否为空
    if [ -z "$502_n"]
    then
      exit
    fi

   #判断502出现次数是否大于100
   if [$502_n -gt 100 ]
   then
      #重启php,将错误日志写入指定文件
      /etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err
      #查询进程是否已经启动
      fpm_p_n = `pgrep -l php-fpm |wc -l`
      #判断进程出现的次数,如果为0就是启动失败
      if [ $fpm_p_n -eq 0 ]
      then
          #发送邮件
          python mail.py xxx@xx.com"php.fpm重启失败" "`head -tmp/php-fpm.err`"
          exit
      fi
   fi

#暂停10秒,每10秒监控一次
sleep 10
done 2.6 删除行

   把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
2.6.1 内容回首

#sed的用法

# 将第3行中所有的 bin 替换成 BIN
# sed '3 s/bin/BIN/g' /etc/passwd   
# 将第2到5行中所有的 bin 替换成 BIN 
#sed '2,5 s/bin/BIN/g' /etc/passwd  
# 将第10行到最后一行中所有的 bin 替换成 BIN
#sed '10,$ s/bin/BIN/g' /etc/passwd 
2.6.2 脚本内容

#!/bin/bash
#打印前五行,并删除含中带字母的行
sed -n '1,5'p 1.txt |sed '//d'
#删除前面5行,原来的6-10变成了1-5;在匹配带字母的内容替换成空;
sed '1,5d' 1.txt |sed '1,5s///g'

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux shell脚本100道练习题(每日更新)