shell练习题(一)

练习一:求两个数的和

#/bin/bash
a=0
b=0
read -p "Input the first number: " a
read -p "Input the second number: " b
sum=$[$a+$b]
echo "The sum is $sum"
exit 0

用到的知识点:

read  接受键盘或者文件的输入。

参数:

        -p  在等待read输入是,输出的提示信息;

        -t   指定等待时间

        -n  接受指定的字符数

        -s   隐藏输入的数据

$    当变量复制完成后,在变量前面加$来获取变量的值。

 

练习二:判断当前用户是不是root

#!/bin/bash

d=`whoami`
if [ $d == "root" ]
 then
   echo "The user is root"
 else
   echo "The user is guest"
fi

或者

#!/bin/bash

if [ $USER == "root" ]
  then
     echo "The user is root"
  else
     echo "The user is guest"
fi

用到的知识点:

   字符串的比较    等于  ==   不等于   !=

   关于 []   bash 的内部命令, [ 和 test 是等同的。Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。因为[ 是Linux内部命令,所以 [ a+b ]之间要有空格。

 

练习三:统计下面地址出现的次数,并且从大到小排序

 

 

http://192.168.110.112/index.html
http://192.168.10.9/index.html
http://192.168.120.187/index.html
http://192.168.1.112/index.html
http://192.168.120.112/index.html
http://192.168.10.9/index.html
http://192.168.120.187/index.html
http://192.168.10.9/index.html

 

[root@mysql shell]# cat cathttp.txt | cut -d '/' -f 3 |sort | uniq -c | sort -nr

 

 

用到的知识点:

 

cut   从标准输入的文本剪切列或者区域,不能用空格分隔

参数:

        -c   指定剪切的字符数

        -f    指定剪切的区域

        -d    指定区域分隔符

 

sort  以行为单位进行排序

参数:

         -g  按照一般数值排序

         -r   反向排序

         -n   根据字符串数值排序

 

uniq   用于检查删除文本中重复出现的行列

         -c   在每行前显示重复出现的次数

         -d   仅显示重复出现的行列

         -u   仅显示出现一次的行列

         -D   显示所有重复的所有行

       

       

练习四:统计连接到服务器的每个ip的情况,并按照从打到小排序

 

[root@mysql shell]# netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'| awk -F ":" '{print $1}' | sort | uniq -c | sort -rn
      3 192.168.110.1

用到的知识点:

awk  文本处理

参数:  -F 指定分隔

 

练习五:找出访问量排在前两位的

192.168.110.20  aa.html
192.168.110.60  aa.html
192.168.110.40  aa.html
192.168.110.70  aa.html
192.168.110.20  aa.html
192.168.110.90  aa.html
192.168.110.70  aa.html
192.168.110.110 aa.html
192.168.110.20  aa.html
192.168.110.130 aa.html
192.168.110.19  aa.html
192.168.110.26  aa.html
192.168.110.26  aa.html
192.168.110.70  aa.html

[root@mysql shell]# cat didi.text  | awk -F " " '{print $1}'| sort | uniq -c | sort -nr | head -2      3 192.168.110.70
      3 192.168.110.20

 

 用到的知识点:

head  输出前几行

参数:

          -n   2  输出前两行

          -c4   输出前四个字符

 

 

 练习五:统计服务器进程(只是练习)

 

ss -na | egrep ^tcp| awk -F " " '{print $5}' | egrep ^1|sort | uniq -c | sort -k2n

新的知识点:

     ss命令:ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

    -n  不显示服务名称

    -a  显示所有

    sort 命令   -k2  按照第二个字符排序   -n  按照数值大小排序

 

 练习六

将文本1.txt的第二列累加 

zhang1   30
li       40
teng     70
sun      55
bao      65

 cat 33.txt |awk -F " " '{sum+=$2} END {print sum}'

 

 练习七:将文本中无序的数排列后打印并求出总和打印

12
23
56
44
77
6
55
99
5
23

 sort -n number.txt | awk '{print $1} {sum+=$1} END {print sum}'
 

 sort命令,根据文本的内容,以行为单位来排序。

参数   -u    去重

          -r     降序

          -n    以数值排序

          -t     指定分隔符

          -k    指定列

awk   $0   打印整行内容    $1第一个字段

 

练习八:查出/home下文件中包含字符"cat" 的文件名称

[root@localhost ~]# grep -r cat /home | awk -F " " '{print $2}'
/home/xuexi/.cache/tracker/meta.db
/home/xuexi/.cache/tracker/meta.db-wal
/home/xuexi/.cache/tracker/ontologies.gvdb
/home/xuexi/.config/dconf/user
/home/xuexi/.local/share/tracker/data/tracker-store.journal
/home/xuexi/.local/share/tracker/data/tracker-store.ontology.journal
jacktxt.txt
jacktxt.txt

 

 grep -r  以符号形式递归地读取每个目录下的所有文件

 

练习九:输入两个数求这两个数的和以及乘积

#!/bin/bash

read -p "Inpute first number :"  num1
read -p "Inpute second number :" num2
sum=$[$num1+$num2]
product=$[$num1*num2]
echo "sum is $sum"
echo "product is $product"

 

练习十:判断一个文件大小

#!/bin/bash
line=`cat /etc/inittab|wc -l`
if [ $line -gt 100 ]
then
    echo "inittab is big file"
else
    echo "inittab is small file"
fi

 

 练习十一:用户判断

#!/bin/bash

checkuser(){
user=`whoami`
if [ $user = tom ]
   then
       echo
   else
       echo "can not execute by user ${USER}"
       echo  -e "\033[41;37m 不能执行操作,请使用tom \033[0m"
    exit 1
fi
}
checkuser
 

 知识点:

$()  将小括号的命令执行,结果赋值给变量   a=$(ls)

${}  变量替换,精确的界定变量范围     例如:  A=B   echo $AB  想输出$A 然后后面跟个B ,但是输出的是  $AB,用  echo ${A}B  则输出BB

 \033    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"

exit  0  用echo  $?查看则返回0 ,表示程序正确结束 ;  exit    1  用echo $?  查看输出  1  程序没有正确结束

echo  -e  处理特殊字符

 

 练习十二:统计文本中的空白行

#!/bin/bash

line=`grep "^$" /etc/inittab |wc -l`

if [ $line -gt 0 ]
  then
    echo "有空行"
    grep -n "^$" /etc/inittab
  else
    ehco "没有空行"
fi

 

 练习十三:定时备份/var/spool/mail下的文件

#!/bin/bash
sj=`date +%Y%m%d-%H-%M-%S`
# echo $sj
fn='mail_'$sj'.tar.gz'
#echo $fn
cd /var/spool/mail && tar -zcvf /home/test3/"$fn"  *  >/etc/null

crontab  -e

30 22 * * *   /root/shell/mail.sh

 练习十三:输入一个用户名,获取密码警告期限;然后判断用户最近一次修改密码的时间距离今天是否已经小于警告期限;

[root@mysql shell]# vi mima.sh 
#!/bin/bash
read -p "请输入一个用户" user
#距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 "修改密码" 的警告信息
W=`grep $user /etc/shadow | cut -d: -f6`
#date +%s  //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)
S=`date +%s`
#计算天数
T=`expr $S / 86400`
#密码有效天数
L=`grep $user /etc/shadow | cut -d: -f5`
#最后一次修改时间
N=`grep $user /etc/shadow |cut -d: -f3`
NY=$[$L-$[$T-$N]]
if [ $NY -lt $W ]
 then
echo "Waring"
 else
echo "OK"
exit 0
fi

 

 date +%s  //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)

 expr 命令,一款多功能计算器

一起学习的朋友可以联系我:

 

 

 

 

 

 

 

 

posted @ 2021-12-18 22:02  中仕  阅读(102)  评论(0编辑  收藏  举报