shell练习题

shell练习题

    • 基础
    • 计算
    • 判断
    • 循环
    • 其他

基础

1.按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应日期的文件
统计Nginx日志中每个IP的访问量有多少,日志如下:

192.168.56.1 - - [21/May/2018:20:44:06 -0400] "GET /index.html HTTP/1.0" 404 169 "-" "ApacheBench/2.3" "-"/code/index.html

awk '{print $1}' nginx.txt |sort|uniq -c|sort -r >>/access.log
  1. 写一个脚本计算一下Linux系统所有进程占用内存大小的和。
    在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件
    1).批量修改txt为txt.bak
    2).把所有的.bak文件打包压缩为123.tar.gz
    3).批量还原文件的名字,及把增加的.bak再删除


计算

  1. 输入两个整数计算这两个整数的相加,相减,相乘,相除,求余的结果

[root@alice scripts]# cat jisuanqi.sh 
#!/bin/bash


read -p "please input two number: " n1 n2
expr $n1 + 1 >/dev/null 2>&1
[ $? -ne 0 ] && echo "请输入两个整数" && exit
expr $n2 + 1  >/dev/null 2>&1
[ $? -ne 0 ] && echo "请输入两个整数" && exit
echo "$n1+$n2=`awk "BEGIN{print $n1+$n2}"` "
echo "$n1-$n2=`awk "BEGIN{print $n1-$n2}"` "
echo "$n1*$n2=`awk "BEGIN{print $n1*$n2}"` "
echo "$n1/$n2=`awk "BEGIN{print $n1/$n2}"` "
  1. 把一个文本文档的前五行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉
sed -n 1,5p passwd |sed '/[a-zA-Z]/d'
sed -n 6,10p passwd |sed 's#[a-zA-Z]##g'
sed 6,10's#[a-zA-Z]##g' passwd |sed '/[a-zA-Z]/d^C
  1. 打印下面这句话中字母数小于5的单词 I am lizhenya teacher I am 18

[root@alice scripts]# cat 2.4.sh 
#!/bin/bash

for i in I am lizhenya teacher I am 18
do
  [ ${#i} -lt 5 ] && echo "$i" 
done
  1. 写个shell,看看你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
[root@alice scripts]# vim 2.5.sh 
#!/bin/bash
# Author: dang kai
# Blog: www.dkaiyun.com
# Time: 2019-03-18 19:50:27
# Name: 2.4.sh
# Version: 4.2.46
# Description: This is a Script.

sum=0

for i in `awk -F: '{print $3}' /etc/passwd`
do
    [ $i  -ge 1000  ] && sum=$[$sum+1]
done
[ $sum -eq 0 ] && echo "当前系统无普通用户"
[ $sum -gt 0 ] && echo "当前系统普通用户数量为:$sum"
  1. 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10

[root@alice scripts]# cat 2.6.sh 
#!/bin/bash
# Author: dang kai
# Blog: www.dkaiyun.com
# Time: 2019-03-18 20:45:28
# Name: 2.6.sh
# Version: 4.2.46
# Description: This is a Script.

echo "此用户最常用命令TOP10: "
echo "使用次数 命令"
awk '{print $1}' /root/.bash_history |sort|uniq -c |sort -nr|head
  1. 编写一个脚本,计算100以内所有能被3整除数字的和
[root@alice scripts]# cat 2.7.sh 
#!/bin/bash
# Author: dang kai
# Blog: www.dkaiyun.com
# Time: 2019-03-18 20:59:53
# Name: 2.7.sh
# Version: 4.2.46
# Description: This is a Script.

for i in `seq 3 3 100`
do
    sum=$[ $sum+$i ]
done
echo "$sum"

或者


seq 3 3 100 |tr '\n' '+'|sed -r 's#(.*)#\10\n#g'|bc

判断

  1. 将下面的条件表达式改写为if条件语句
    [ -f /etc/hosts ] && echo !
test -f /etc/hosts 
if  [ $? = 0 ]
then
echo !
fi
  1. 写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些
for i in ` seq 1 254 `
do
   {
    ping  -c 1 -w 1 223.5.5.$i	&>/dev/null

   if  [  $? -eq 0 ]
   then
      echo " 223.5.5.$i 是在线的"
   fi
    }&
done
  1. 用shell处理以下内容

the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more information

3.1 按单词出现频率降序排序!

echo "the squid project provides a number of resources toassist users design
implement and support squid installations. Please browsethe documentation and
support sections for more infomation" |grep -o '[a-zA-Z]'|sort|uniq -c|sort -nr|
head

3.2 按字母出现频率降序排序

echo "the squid project provides a number of resources toassist users design
implement and support squid installations. Please browsethe documentation and
support sections for more infomation" |sed 's#[,.]##g'|xargs -n1|sort|uniq -c
sort -nr
  1. 使用ps aux查看系统进程发现有100多个test.sh脚本正在运行,如何杀死所有的test.sh
ps aux |grep  test.sh|grep -v grep|awk '{print $2}'|xargs kill -9
  1. 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小
num=`echo $((RANDOM%100+1))`

while true
do
    read -p "请输入一个数字: " an
    expr $an + 1  &>/dev/null
    if [ $? -eq 0 ]
    then
    let i++
        [ $an -gt $num ] && echo "您输入的数大了"  && continue
        [ $an -lt $num ] && echo "您输入的数小了"  && continue
        [ $an -eq $num ] && echo "您猜对了"   && break
    fi
done
echo "您一共猜了 $i 次"
  1. 用Shell实现,把一个文本文档中只有一个数字的行给打印出来
hangshu=`cat passwd |wc -l`
for i in `seq $hangshu `
do
    lenth=`sed -n "$i"p  passwd |sed s#[^0-9]##g|wc -L`
    if
       [[ $lenth = 1 ]]
    then
       sed -n "$i"p passwd
    fi
done
  1. 写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常
#! /bin/bash
read -p “请输入网站名称: ” web
curl -sI web |awk 'NR==1{print $2}'
if [ $web = 200 ]
then
	echo “正常”
else
	echo “异常”
fi

循环

  1. 使用while循环使1加到100
i=0
while [ $i -le 100 ] 
do
  sum=$[ $sum+$i ]
  let i++
done
echo $sum
  1. 查看磁盘/当前使用状态,如果使用率超过80%则把结果输出到/var/log/disk.err
disk=`df -h |awk 'NR==2 {print $(NF-1)}'`
if [ ${disk%\%} -ge 80 ]
then
        echo " `date` 当前硬盘使用率为: $disk " >>/var/log/disk.err
fi
  1. 脚本批量创建10个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断
read -p "请输入用户名前缀: " qian

[ -z $qian ] && echo "前缀不能为空! " && exit

read -p "请输入需要创建的用户数量: " shu

[[ ! $shu =~ ^[0-9]+$ ]] && echo "请输入一个整数" && exit

echo "创建数量: $shu "

for i in  `seq $shu`
do 
    useradd $qian$i
done
tail /etc/passwd
  1. 使用case语句编写nginx启动脚本
#!/bin/bash
# Author: dang kai
# Blog: www.dkaiyun.com
# Time: 2019-03-20 11:59:58
# Name: nginx.sh
# Version: 4.2.46
# Description: This is a Script.

. /etc/init.d/functions

start(){
#/etc/init.d/nginx
systemctl start nginx
		if [ -f /var/run/nginx.pid ]
		then
		action "nginx start is"  true
		else
		action "nginx start is"  false
		fi
}

stop(){
systemctl stop nginx
		if [ -f /var/run/nginx.pid ]
		then
		action "nginx start is"  false
		else
		action "nginx start is"  true
		fi
}

reload(){
systemctl reload nginx
		if [ -f /var/run/nginx.pid ]
		then
		action "nginx start is"  true
		else
		action "nginx start is"  false
		fi
}

status(){
		if [ -f /var/run/nginx.pid ]
		then
		echo  -e "nginx is \033[32m running... \033[0m"  
		else
		echo -e "nginx is \033[31m death... \033[0m"
		fi
}
restart(){
systemctl restart nginx
                if [ -f /var/run/nginx.pid ]
                then
                action "nginx start is"  true
                else
                action "nginx start is"  false
                fi
}



case $1 in 
	start)
	start
	;;
	stop)
	stop
	;;
	reload)
	reload
	;;
	restart)
	restart
	;;
        status)
        status
	;;
        *)
	echo  "语法: sh `basename $0` [start|stop|reload|staus|restart]" 

esac

  1. 抓阄题目学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。
    因此需要挑选学生,因此需要一个抓阄的程序:
    要求:
    1、 执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
    2、 第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。

先创建一个文件 用来记录

[root@alice scripts]# touch name.tx
[root@alice scripts]# cat zhuajiu.sh 
#!/bin/bash
# Author: dang kai
# Blog: www.dkaiyun.com
# Time: 2019-03-21 15:07:43
# Name: zhuajiu.sh
# Version: 4.2.46
# Description: This is a Script.
while true
do
	num=`echo $((RANDOM%100))`
	chongfu=`grep -w "$num" name.txt |wc -l`
	if [  $chongfu -eq 1 ]; then
		continue
#	elif [  ${#name} -eq 0 ]; then
#		continue
#	elif [ "$name" = "exit" ]; then
#		break
	else
		read -p "请输入您的英文名[jenny]: " name
		[  ${#name} -eq 0 ] && continue 
		[ "$name" = "exit" ] && break
		echo -e "$name \t $num " | tee -a name.txt
	fi

done
cat name.txt |sort -nrk2|head -n3

  1. 打印一个菜单如下,然后用循环加case语句输出用户输入菜单选项的结果(8分)

h 显示命令帮助
f 显示登陆信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

menu(){
cat<

其他

  1. 生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果
while true
do 
	ran=`echo $((RANDOM%100+1))`
	sum=$(($sum+$ran))
	if [ $sum -gt 1000 ]
	then
    echo "结果为 $sum"
	break
	fi
done

  1. 生成0-100之间的随机数,并相加,直到大于1000,并判断最后一个随机数字能否被3整除
while true
do 
	ran=`echo $((RANDOM%100+1))`
	sum=$(($sum+$ran))
	if [ $sum -gt 1000 ]
	then
	break
	fi
done
zhengshu=`echo $((RANDOM%3))`
if [ $zhengshu -eq 0  ];then
echo "随机数为 $sum 并且可以被3整除  "
else
echo "随机数为 $sum 不可以被3整除  "
fi

  1. 判断/tmp目录下是否有大于4k的文件,如果有则输出该文件的大小与创建时间
file=`find /tmp -type f -size +4k `
ls -l $file |awk '{print $5,$6,$7,$8,$NF} '

  1. 数组array=(1 2 3 4 5 6)使用脚本打印出每个元素(每行显示一个元素)
array=(1 2 3 4 5 6)
for i in `echo ${array[*]}`
do
	echo "$i"
done

  1. 使用数组判断I am oldboy teacher welcome to training class中字母数大于6的单词
array=(I am oldboy teacher welcome to training class)
for i in `echo ${array[*]}`
do
	length=`echo $i |wc -L`
	if [ $length -gt 6 ];then
	echo "$i"
	fi
done

你可能感兴趣的:(shell)