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 命令,一款多功能计算器
一起学习的朋友可以联系我: