1.公钥批量分发

shell 实现 100 台服务器的公钥的批量分发;LLD 规划:100 台服务器 ip 为:192.168.42.101-201,root 密码:123456。

#远程机器的用户名和密码
password=123456
username=root
#将本机的公钥复制到远程机器的authorized_keys文件中
main(){sshpass -p $password ssh-copy-id -o StrictHostKeyChecking=no $username@192.168.42.$1 >/dev/null 2>&1
if [ $? -eq 0 ]
thenecho "192.168.42.$1 is successful..."
fi
}
#检查sshpass工具是否安装
basecheck(){which sshpass >/dev/null 2>&1
if [ $? -ne 0 ]
thenyum install sshpass -y >/dev/null 2>&1
fi
}
#检查网络是否畅通,若通畅则发送ssh公钥
netcheck(){for j in {101..201}
doping -c 1 192.168.42.$j >/dev/null 2>&1if [ $? -eq 0 ]thenmain $jelseecho "192.168.42.$j 网络不通畅..."fidone
}
basecheck
netcheck

2.网址中的域名统计

处理以下文件内容,将域名取出并进行计数排序。

http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html

得到如下结果:

域名出现的次数 域名
2 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
cat <<EOF
域名出现的次数 域名
EOF
array=(
"http://www.baidu.com/index.html"
"http://www.baidu.com/1.html"
"http://post.baidu.com/index.html"
"http://mp3.baidu.com/index.html"
"http://www.baidu.com/3.html"
"http://post.baidu.com/2.html"
)
#检查临时域名文件是否存在,存在则删除
check(){test -f yuming.txt
if [ $? -eq 0 ]
thenrm -rf yuming.txt
fi
}
#域名统计处理及结果输出
operate(){for var in ${array[@]}
doecho $var >> yuming.txt
done
awk -F '/' '{print $3}' yuming.txt |sort -r|uniq  -c
}
check
operate
check

其他方法

cut -d / -f3 file.txt |sort -r |uniq -c
awk -F "/"'{S[$3]=S[$3]+1}END{for(k in S) print k,S[k]}' file.txt|sort -r
sed -r 's#http://(.*)/.*#\1#g' file.txt |sort -r|uniq -c

3.shell+定时计划任务:归档备份

设计一个 shell 程序,在每天凌晨压缩打包/etc 目录下的所有内容,存放在/root/bak 目录里,且文件名为如下形式 yymmdd_etc.tar.gz(yy 为年,mm 为月,dd 为日),该目录保存 7 天内容;Shell 程序 fileback 存放在/usr/bin 目录下。

day="`date +%Y%m%d`"
dir=/root/bak
backupdir="`date +%Y%m%d`_etc.tar.gz"
#查看/root/bak目录是否存在,如果不存在,则创建目录
checkbak(){if [ ! -e $dir ]
thenmkdir $dir
fi
}
#压缩打包/etc目录下,存放在/root/bak目录里
backup(){tar -zcvf /root/bak/$backupdir /etc/ > /dev/null 2>&1
echo "$backupdir 压缩打包成功 successful"
}
#清除7天前的过期文件
clean(){find $dir -mtime +7 -exec rm -rf {} \;
if [ $? -eq 0 ]
thenecho "过期数据清除成功 successful"
elseecho "$day 过期数据清理失败 error,请及时关注"
fi
}
checkbak
backup
clean

4.shell开发运维管理工具(1)

shell 开发运维管理工具,要求:用户交互,当用户输入菜单号时,打印相关内容。

菜单
1. 磁盘分区
2. CPU 负载
3. 剩余内存
4. 退出
输入:1
输出:(主机名,系统版本,分区情况)
hostname:
system:系统版本
---------分区一-----------(分区变量输出)
path:分区一
size:大小
file_os:分区文件系统类型
mount_on:分区挂载点
----------分区二----------
path:分区二
size:大小
file_os:分区文件系统类型
mount_on:分区挂载点
输入:2
输出:
1 分钟平均负载:
5 分钟平均负载:
15 分钟平均负载:
输入:3
输出:
目前可用内存:
可用 Swap 分区:
输入:4
输出:
Bey…
cat <<EOF
---------------------------1.磁盘分区2.CPU负载3.剩余内存4.退出
---------------------------
EOF
while true
do
read -p "请选择功能(1~4):" num
case $num in1)echo "hostname:   `cat /etc/hostname | awk 'BEGIN{FS="."}{print $1}'`"echo "system:   `uname -r`"echo "------------------/dev/sda1--------------------------"echo "path:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $1}'`"echo "size:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $2}'`"echo "file_os:`df -T | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $2}'`"echo "mount_on:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $6}'`"echo "------------------/dev/sda2--------------------------"echo "path:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $1}'`"echo "size:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $2}'`"echo "file_os:`df -T | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $2}'`"echo "mount_on:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $6}'`";;2)echo "1分钟平均负载:`uptime | awk 'BEGIN{FS="[ |,]"}{print $14}'`"echo "10分钟平均负载:`uptime | awk 'BEGIN{FS="[ |,]"}{print $16}'`"echo "15分钟平均负载:`uptime | awk 'BEGIN{FS="[ |,]"}{print $18}'`";;3)echo "目前可用内存:`free -h | awk 'BEGIN{FS=" "} /^M/ {print $4}'`"echo "可用Swap分区:`free -h | awk 'BEGIN{FS=" "} /^S/ {print $4}'`";;4)exit 0;;*)echo "请输入正确的菜单项!"
esac
done

5.shell解决就餐问题

shell 编程完成以下需求。

1 食堂:中国人(人民币)
2 食堂:外国人(美元)
汇率 6.798
菜单:
宫保鸡丁 (1)(荤): 8.6
鱼香肉丝 (2)(荤):2.5
豆芽炒青菜 (1)(素):5.5
椒盐蘑菇 (2)(素):1.9

倘若一哥们每天必须吃一个肉一个素;用脚本实现搭配的最低消费。

array=(
"宫保鸡丁 (1)(荤):8.6"
"鱼香肉丝 (2)(荤):2.5"
"豆芽炒青菜 (1)(素):5.5"
"椒盐蘑菇 (2)(素):1.9"
)
#检查临时菜单是否存在,存在则删除
check(){test -f caidan.txt
if [ $? -eq 0 ]
thenrm -rf caidan.txt
fi
test -f file01.tmp
if [ $? -eq 0 ]
thenrm -rf file01.tmp
fi
}
#创建临时菜单文件
create(){for var in ${array[@]}
doecho $var >> caidan.txt
done
}
#菜单文件处理及结果输出
operate(){array01=(`cat caidan.txt |grep \(2\)`)
b=`cat caidan.txt |grep \(1\)`
a=`for j in ${array01[@]};do echo $j;done |awk -F: -v OFS=':' '{print $1,$2*6.798}'`
for i in $b
doecho $i >> file01.tmp
done
for j in $a
doecho $j >> file01.tmp
done
array02=(`cat file01.tmp |grep \(荤\)`)
array03=(`cat file01.tmp |grep \(素\)`)
c=`for k in ${array02[@]};do echo $k;done |sort -n -k2 |head -1`
d=`for z in ${array03[@]};do echo $z;done |sort -n -k2 |head -1`
echo $c
echo $d
}
check
create
operate
check

6.shell开发运维管理工具(2)

编写1个弹出式菜单的shell程序并实现其简单的菜单功能

*******************************************************
*                         MENU                          *
*         1.copy                   2.rename             *
*         3.remove                 4.find               *
*                          5.exit                       *
*******************************************************

用户按下数字1,则提示用户输入源和目的文件名后执行复制;输入数字2,则提示用户输入要更名的文件或目录后执行更名操作;输入数字3,则提示用户输入要删除的文件并执行删除操作;输入数字4,则提示用户输入要查找的文件并执行查找操作;输入数字5,则退出该菜单shell程序的执行。

#shell实现复制、重命名、删除、查找
cat << EOF
*******************************************************
*                         MENU                        *
*         1.copy                   2.rename           *
*         3.remove                 4.find             *
*                          5.exit                     *
*******************************************************
EOF
output(){if [ $1 -eq 0 ]
thenecho "success"
elseecho "fail"
fi
}
while true
do
read -p "请选择功能(0-5):" num
case $num in1)read -p "请输入源和目的文件名(绝对路径):" s dcp -r $s $doutput $?;;2)read -p "请输入要更名的文件或目录(绝对路径):" old newmv $old $newoutput $?;;3)read -p "请输入要删除的文件(绝对路径):" filenamerm -rf $filenameoutput $?;;4)read -p "请输入要查找的文件:" namefind / -name $name;;5)exit;;*)echo "请输入数字0-5!"
esac
done

7.自动删除用户账号

编写shell程序,实现自动删除50个用户账号的功能,账号名为stud1至stud50

#自动删除50个用户账号
j=0
for i in `seq 1 50`
douserdel -r stud$i &>/dev/nullif [ $? -eq 0 ]thenj=$(($j+1))elseecho "用户账号stu$i不存在"fi
done
echo "$j个用户账号删除完毕,$(($i-$j))个用户账号不存在"

删除5个账号测试:

8.九九乘法表

#九九乘法表
for((i=1;i<=9;i++))
dofor((j=1;j<=i;j++))do
#        echo -ne "$i*$j=$(($i*$j))\t"echo -ne "$(($i*$j))\t"doneecho ""
done

9.文本处理面试题

(1)[腾讯面试题]:一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户。
Ip_input.txt的内容假设如下:
219.217.49.14
175.43.4.87
87.48.98.1
59.73.38.25
219.217.50.14
59.92.48.32
219.217.49.14
59.72.38.142
59.73.38.25
219.217.49.14

#!/bin/bash
echo "登陆次数最多的用户IP为:`sort Ip_input.txt|uniq -c|sort -nr|awk '{print $2}'|head -n 1`"

(2)腾讯shell试题
假设qq.tel文件内容:
12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544
请分类如下:
[12334]
13510014336
12343453453

[12099]
13598989899
12343454544

sort qq.tel|awk -F: '{if(tmp!=$1){tmp=$1;print "["tmp"]";}print $2}'
(3) 文件内容如下:
100
a 100
b -50
c -20
d -30
要求输出结果为:
100
a 100
200
b -50
150
c -20
130
d -30
awk 'NR==1{sum=$1;print $0}NR!=1{print $0;sum=sum-$2;print sum}' file
(4)文件内容如下:
123abc456
456def123
567abc789
789def567
要求输出:
456ABC123
123DEF456
789ABC567
567DEF789
sed -r 's/([1-9]{3})([a-f]{3})([1-9]{3})/\3\2\1/;y/abcdef/ABCDEF/' file
(5)文件内容如下
1.1.1.1 11
1.1.1.1 22
1.1.1.1 33
1.1.1.1 44
2.2.2.2 11
2.2.2.2 22
2.2.2.2 33
2.2.2.2 44
要求使用awk将文件输出:
1.1.1.1 11 22 33 44
2.2.2.2 11 22 33 44
awk '{sum[$1]=sum[$1]" "$2}END{for(var in sum)print var sum[var]}' file

10.判断一个指定的脚本是否有语法错误

写一个脚本,判断一个指定的脚本是否是语法错误。如果有错误,则提醒用户键入Q或者q:无视错误并退出;其它任何键可以通过vim打开这个指定的脚本。

#!/bin/bash
read -p "please input check script:" file
if [ -f $file ]
thensh -n $file >/dev/null 2>&1if [ $? -ne 0 ]thenread -p "you input $file syntax error,[Type q/Q to exit or Type other to edit]" answercase $answer inQ|q)exit 0;;*)vim $file;;esacfi
elseecho $file is not existexit 1
fi

11.wget下载管理

创建一个函数,能接受两个参数:
1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;
2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本;
3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本;

#!/bin/bash
#根据用户输入创建保存目录或退出执行
checkmk(){if [ $2 == "y" ]
thenmkdir -p $1tmp2=0
elif [ $2 == "n" ]
thentmp2=51
elseecho "[y/n]输入错误error"
fi
return $tmp2
}
#检查下载保存目录是否存在,若存在则下载,否则询问是否创建保存目录
checkdir(){if [ -d $1 ]
thentmp=0
elsetmp=51read -p "是否要创建目录$1[y/n]?" answercheckmk $1 $answertemp=$?if [ $temp -ne 0 ]thenecho "用户不同意创建目录,错误码:$temp"elsetmp=0echo "$1目录创建成功"fi
fi
return $tmp
}
#下载文件
download(){checkdir $2
tmp1=$?
if [ $tmp1 -eq 0 ]
thenwget -P $2 -rnd $1 >/dev/null 2>&1if [ $? -eq 0 ]thentmp2=0elsetmp2=52fi
fi
return $tmp2
}
#主函数接受两个参数:URL和目录
main(){download $1 $2
if [ $? -eq 0 ]
thenecho "wget is successful"
elseecho "wget is error,错误码:52"
fi
}
main $1 $2

12.解压缩程序

编写一个shell程序,分别能够解压gz、bz2、xz和zip格式文件,其他文件给出提出信息“不认识文件类型”
建立测试文件:
# tar czvf a.tar.gz *.sh
# tar cjvf b.tar.bz2 *.sh
# tar cJvf c.tar.xz *.sh
# zip d.zip *.sh

#!/bin/bash
check(){if [ $1 -eq 0 ]
thenecho "$file decompressed successfully"
elseecho "$file decompressed failed"
fi
}
read -p "请输入要解压文件的名称:" file
if [ -f $file ]
thencase $file in*gz)tar xzvf $file >/dev/nullcheck $?;;*bz2)tar xjvf $file >/dev/nullcheck $?;;*xz)tar xJvf $file >/dev/nullcheck $?;;*zip)unzip -n $file >/dev/nullcheck $?;;*)echo "文件格式不正确,无法解压"esac
elseecho "$file文件不存在"
fi

Linux实战——Shell编程练习(更新12题)相关推荐

  1. 运维 - 第一阶段 - linux与shell编程

    linux与shell编程 讲师:墨竹 系统运维与linux 1.系统运维是什么 简单来说运维(Operation and maintenance)是指对公司硬件和软件的维护. 硬件包括:机房.机柜. ...

  2. Linux _ Shell编程 — 功能语句

    Linux _ Shell编程 - 功能语句 一.说明性语句 二.常用功能性语句 1.常用功能性语句(read命令) 2.expr命令 三.结构性语句 条件测试语句 字符串测试 整数测试 文件的测试 ...

  3. linux系统——Shell编程之变量解释

    linux系统--Shell编程之变量解释 - Shell能做什么 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略-) 自动化批量软件部署程序 (LAMP,LNMP,Tomca ...

  4. shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

    浅谈Linux下shell 编程的for循环常用的6种结构 1. 常用for循环结构 (1) for 变量 in 值1 值2 值3... do 程序块儿 done (2) for 变量 in `命令` ...

  5. linux中快捷脚本,Linux下Shell编程快捷键大全(日常整理)

    有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a: ...

  6. Linux _ Shell编程 — 循环语句

    Linux _ Shell编程 - 循环语句 一.循环语句for的用法 二.循环语句while的用法 三.循环控制语句 一.循环语句for的用法 for 变量名 in 单词表do命令表done 变量依 ...

  7. Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向

    ​ 最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! ​ Shell 函数 1. 自定义函数 linux she ...

  8. 【编程实践】Linux / UNIX Shell编程极简教程

    不同于一般的介绍Linux Shell 的文章,本文并未花大篇幅去介绍 Shell 语法,而是以面向"对象" 的方式引入大量的实例介绍 Shell 日常操作,"对象&qu ...

  9. Linux之shell编程

    walkingLL 2018-09-22 08:51:26 14717 收藏 129 shell历史 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互 ...

  10. 第14章 Linux的shell编程

    文章目录 文档配套视频讲解链接地址 第14章 Shell编程 14.1 Shell简介 1. **Shell交互过程** **2. 选择Shell** 2. 编译型语言与解释型语言 **14.2 sh ...

最新文章

  1. 脑电分析系列[MNE-Python-5]| Python机器学习算法随机森林判断睡眠类型
  2. 客户流失预警模型-GBDT模型
  3. 65.4. Other GUI - phpOraAdmin
  4. 静态方法里面不能调用非静态属性
  5. 求职招聘市场复苏!市场平均薪资超8000元
  6. Golang go 命令
  7. [转载] python mongodb update
  8. C++学生信息管理系统7.0
  9. 用计算机函数,信息技术应用 用计算机画函数图象教案设计(一等奖)
  10. jzoj立体井字棋【数学】
  11. w5500telnet协议详解_STM32F103VCT6+W5500 telnet功能实现
  12. 华为设备MSTP配置命令
  13. ZT:【搞笑】某大学生毕业自我鉴定
  14. 自己的小程序修修补补
  15. undi是什么意思_undefined是什么意思?
  16. matlab app使用对话框读取和保存文件
  17. Soul瞬间发布长视频教程
  18. @Autowired(required=true)
  19. linux 关机和重启命令
  20. 医院财务会计的互联网变革

热门文章

  1. 关系数据模型——三个组成部分
  2. js 打印去掉页眉页脚页码_JS实现无页眉页脚打印(转)
  3. java 通用事件回调类(观察者队列)
  4. 【复杂网络社团发现】Gephi绘制网络图
  5. excel TEXT 函数
  6. Drools规则引擎-如果Fact对象参数为null如何处理
  7. 传奇脚本关于!Setup.txt 详细介绍
  8. 如何打开管理员命令提示符窗口?
  9. Python编程要点:列表操作和Python的Fraction类(代码实现和练习)
  10. win10Ie重置.html默认应用设置,win10系统IE浏览器设置为默认浏览器的操作方法