Shell习题100例
每日一文件
https://github.com/aminglinux/shell100/blob/master/
要求:安照这样的日期格式(xxxx-xx-xx)每日生成一个文件,如生成的文件为2017-12-20.log,并且把磁盘的使用情况写到这个文件中,提示:date、df
- [root@centos-04 tmp]# date
- 2018年 12月 26日 星期三 19:29:13 CST
- [root@centos-04 tmp]# date +%Y
- 2018
- [root@centos-04 tmp]# date +%y
- 18
- [root@centos-04 tmp]# date +%d
- 26
- [root@centos-04 tmp]# date +%m
- 12
- [root@centos-04 tmp]# date +%H
- 19
- [root@centos-04 tmp]# date +%M
- 30
- [root@centos-04 tmp]# date +%S
- 52
- [root@centos-04 tmp]# date +%s
- 1545823854
- [root@centos-04 tmp]# date +%F
- 2018-12-26
- [root@centos-04 tmp]# date +%T
- 19:31:04
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# date +%w
- 3
- [root@centos-04 tmp]# date +%W
- 52
- [root@centos-04 tmp]#
昨天日期
- [root@centos-04 tmp]# date -d "-1 day" +%F
- 2018-12-25
- [root@centos-04 tmp]#
上一小时
- [root@centos-04 tmp]# date -d "-1 hours" +%T
- 18:34:54
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 1.sh
- #!/bin/bash
- d=`date +%F`
- df -h > $d.log
- ~
- [root@centos-04 tmp]# sh 1.sh
- [root@centos-04 tmp]# ls
- 1.sh ansible-ssh-192.168.242.130-22-root ansible-ssh-192.168.242.133-22-root lua_uwpzx3 tmp.SLBPtZ45L9
- 2018-12-26.log ansible-ssh-192.168.242.131-22-root elasticsearch.4Kw1U8qo nginx_proxy_tmp
- 456.log ansible-ssh-192.168.242.132-22-root hsperfdata_root proxy.log
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# cat 2018-12-26.log
- 文件系统 容量 已用 可用 已用% 挂载点
- /dev/mapper/centos-root 18G 6.2G 12G 36% /
- devtmpfs 898M 0 898M 0% /dev
- tmpfs 910M 0 910M 0% /dev/shm
- tmpfs 910M 30M 881M 4% /run
- tmpfs 910M 0 910M 0% /sys/fs/cgroup
- /dev/sda1 497M 167M 331M 34% /boot
- tmpfs 182M 0 182M 0% /run/user/0
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/ffa13b95ae63f2954be362511c25724d5b854201e405eb4913b54b80e9cf6617/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/f42d989248587138ac2094003ae274467518b1a15d8ead51664cc03ea0c94e59/shm
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/53a9f09976bd64507e995cffd443f1e151fddd88c266afc416d0fb90cb90de14/merged
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/35bdef03d5af944aa5b87ee4d0ca692a6d4b6394f94633f26ebc78e664ca3150/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/e6060a8f50ed0c2455e55ae466f101226d2668a28d8e19070bf4f6b2b3c6dd73/shm
- shm 64M 0 64M 0% /var/lib/docker/containers/c58be577ba9f3351c23c5d1d1ec9661f129aa109735d42046a9e9e465a787306/shm
- [root@centos-04 tmp]#
改进版
- d=`date +%F` #获取当前日期
- dir=/data/logs/disklog #指定日志文件生成的目录
- if [ ! -d $dir ] #判断如果没有目录创建
- then
- mkdir -p $dir
- fi
- df -h > $dir/$d.log #将硬盘信息写到日志
- find $dir/ -mtime +365 |xargs rm #删除一年之前的文件
统计IP访问量
- awk '{print $3}' access_log.2018122918 |sort -n|uniq -c|sort -n -r|less
- [root@centos-04 tmp]# vim 2.sh
- #!/bin/bash
- awk '{print $3}' access_log.2018122918 |sort -n|uniq -c|sort -n -r
- [root@centos-04 tmp]# sh 2.sh
统计内存占用之和
- ps aux|sed '1d' (删除结果中第一行)
- [root@centos-04 tmp]# vim 3.sh
- #!/bin/bash
- sum=0
- for n in `ps aux |grep -v 'TIME COMMAND' |awk '{print $6}'`
- do
- sum=$[$sum+$n]
- done
- echo $sum
- [root@centos-04 tmp]# sh 3.sh
- 114892
- [root@centos-04 tmp]# free
- total used free shared buff/cache available
- Mem: 1863224 104260 1610364 9976 148600 1593352
- Swap: 0 0 0
- [root@centos-04 tmp]#
检测机器存活
- [root@centos-04 tmp]# ping -c2 www.baidu.com|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $NF}'
- 0
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim mail.py
- #!/usr/bin/env python
- #-*- coding: UTF-8 -*-
- import os,sys
- reload(sys)
- sys.setdefaultencoding('utf8')
- import getopt
- import smtplib
- from email.MIMEText import MIMEText
- from email.MIMEMultipart import MIMEMultipart
- from subprocess import *
- def sendqqmail(username,password,mailfrom,mailto,subject,content):
- gserver = 'smtp.qq.com'
- gport = 25
- try:
- # msg = MIMEText(unicode(content).encode('utf-8')) //如果发送的邮件有乱码,可以尝试把这行改成如下:
- msg = MIMEText(content,'plan','utf-8')
- msg['from'] = mailfrom
- msg['to'] = mailto
- msg['Reply-To'] = mailfrom
- msg['Subject'] = subject
- smtp = smtplib.SMTP(gserver, gport)
- smtp.set_debuglevel(0)
- smtp.ehlo()
- smtp.login(username,password)
- smtp.sendmail(mailfrom, mailto, msg.as_string())
- smtp.close()
- except Exception,err:
- print "Send mail failed. Error: %s" % err
- def main():
- to=sys.argv[1]
- subject=sys.argv[2]
- content=sys.argv[3]
- ##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)
- sendqqmail('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,subject,content)
- if __name__ == "__main__":
- main()
- #####脚本使用说明######
- #1. 首先定义好脚本中的邮箱账号和密码
- #2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"
- [root@centos-04 tmp]# vim 4.sh
- #!/bin/bash
- n=`ping -c5 www.baidu.com|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $F
- N}'`
- if [ -z "$n" ]
- then
- echo "脚本有问题。"
- exit
- else
- n1=`echo $n|sed 's/[0-9]//g'`
- if [ -n "$n" ]
- then
- echo "脚本$0有问题。"
- exit
- fi
- fi
- m=123@qq.com
- while :
- do
- if [ $n -ge 50 ]
- then
- python mail.py $m "机器宕机" "丢包率$n%"
- fi
- sleep 30
- done
批量改文件名
- [root@centos-04 tmp]# cp -r /123/ /123.bak
- [root@centos-04 tmp]# tar -tf 123.tar.gz
- [root@centos-04 tmp]# vim 5.sh
- #!/bin/bash
- find /123/ -type f -name "*.txt" > /tmp/txt.list
- for f in `cat /tmp/txt.list`
- do
- mv $f $f.bak
- done
- #find /123/ -type f -name *.txt |xargs -i mv {} {}.bak
- #find /123/ -type f -name *.txt -exec mv {} {}.bak \;
- for f in `cat /tmp/txt.list`
- do
- echo $f.bak
- done > /tmp/txt.bak.list
- tar -czvf 123.tar.gz `cat /tmp/txt.bak.list |xargs`
- for f in `cat /tmp/txt.list`
- do
- mv $f.bak $f
- done
- [root@centos-04 tmp]# rsync -av /123.bak/ /123/
检测80端口
- [root@centos-04 tmp]# netstat -lntp |grep 80
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6938/nginx: master
- tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 6938/nginx: master
- tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 6938/nginx: master
- [root@centos-04 tmp]# netstat -lntp |grep ':80 '
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6938/nginx: master
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# yum install -y nmap
- [root@centos-04 tmp]# nmap -p 80 127.0.0.1
- Starting Nmap 6.40 ( http://nmap.org ) at 2019-01-04 03:29 CST
- Nmap scan report for localhost (127.0.0.1)
- Host is up (0.00011s latency).
- PORT STATE SERVICE
- 80/tcp open http
- Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 6.sh
- #!/bin/bash
- m=123@123.com
- while :
- do
- n=`netstat -lntp |grep ':80 '|wc -l`
- if [ $n -eq 0 ]
- then
- /usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err
- python mail.py $m "80端口关闭" "已经重启httpd服务"
- pn=`pgrep -l httpd|wc -l`
- if [ $pn -eq 0 ]
- then
- python mail.py $m "httpd重启失败" "`head -1 /tmp/apache.err`"
- fi
- sleep 30
- done
也可以用nohup或screen这screen里执行6.sh
- [root@centos-04 tmp]# nohup sh 6.sh &
- [root@centos-04 tmp]# nmap -p 80 127.0.0.1 |grep '80/tcp' |awk '{print $2}' (用nmap写法)
- open
- [root@centos-04 tmp]#
备份数据库
- [root@centos-04 tmp]# vim 7.sh
- #!/bin/bash
- d1=`date +%w`
- d2=`date +%d`
- local_backdir=/bak/mysql
- remote_backdir=192.168.242.130::backup
- exec 1> /tmp/mysqlbak.log 2>/tmp/mysqlbak.err
- echo "mysql backup begin at `date`"
- mysqldump -uroot -pxxx discuz > $local_backdir/discuz.sql.$d1
- rsync -az $local_backdir/discuz.sql.$d1 $remote_backdir/discuz.sql.$d2
- echo "mysql backup end at `date`"
检测502
1.502的情况:php配置有问题、php脚本耗资源。
- [root@centos-04 tmp]# vim 8.sh
- #!/bin/bash
- log=/data/log/access.log
- while :
- do
- 502_n=`tail -n 300 $log |grep -c ' 502 '`
- if [ -z "$502_n" ]
- then
- exit
- fi
- if [ $502_n -gt 100 ]
- then
- /etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err
- fpm_p_n=`pgrep -l php-fpm|wc -l`
- if [ $fpm_p_n -eq 0 ]
- then
- python mail.py xxx@xx.com "php-fpm err" "head -1 /tmp/php-fpm.err"
- exit
- fi
- fi
- sleep 10
- done
删除字母和行
1.删除前五行中包含字母的行
- [root@centos-04 tmp]# head -n5 test.sql |sed '/[a-zA-Z]/d'
2.查看文件前5行
- [root@centos-04 tmp]# sed -n '1,5'p mail.py
- #!/usr/bin/env python
- #-*- coding: UTF-8 -*-
- import os,sys
- reload(sys)
- sys.setdefaultencoding('utf8')
- [root@centos-04 tmp]#
3.把6到10行中的全部字母删掉
- [root@centos-04 tmp]# vim 9.sh
- #!/bin/bash
- sed -n '1,5'p 1.txt|sed '/[a-zA-Z]/d'
- sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g'
找单词
- [root@centos-04 tmp]# for w in Bash also interprets a number of multi-character options.; do echo $w; done
- Bash
- also
- interprets
- a
- number
- of
- multi-character
- options.
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 10.sh
- #!/bin/bash
- c="Bash also interprets a number of multi-character options."
- n=`echo $c|awk -F '[ +-.]' '{print NF}'`
- for ((i=1;i<$n;i++))
- do
- l=`echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L`
- if [ $l -lt 6 ]
- then
- echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
- fi
- done
- [root@centos-04 tmp]# sh 10.sh
- Bash
- also
- a
- of
- multi
- [root@centos-04 tmp]#
输入数字执行命令
- [root@centos-04 tmp]# vim 11.sh
- #!/bin/bash
- echo "*cmd meau** 1 - date 2 - ls 3 - who 4 - pwd"
- read -p "Please input a number:" n
- if [ -z "$n" ]
- then
- echo "请输入一纯数字,范围1-4。"
exit- fi
- n1=`echo $n|sed 's/[0-9]//g'`
- if [ -n "$n1" ]
- then
- echo "请输入一个纯数字,范围1-4。"
- exit
- fi
- case $n in
- 1)
- date
- ;;
- 2)
- ls
- ;;
- 3)
- who
- ;;
- 4)
- pwd
- ;;
- *)
- echo "请输入1-4的数字"
- ;;
- esac
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:1
- 2019年 01月 04日 星期五 21:43:35 CST
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:2
- 10.sh 11.sh 1.sh 2018-12-26.log 2.sh 3.sh 456.log 4.sh 5.sh 6.sh 7.sh 8.sh 9.sh mail.py test.sql tmp.SzNhh17qiE
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:3
- root pts/1 2019-01-04 18:26 (192.168.242.1)
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:4
- /tmp
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:5
- 请输入1-4的数字
- [root@centos-04 tmp]# sh 11.sh
- *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
- Please input a number:fsaf
- 请输入一个纯数字,范围1-4。
- [root@centos-04 tmp]#
批量创建用户
- [root@centos-04 tmp]# seq -w 00 09
- 00
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- [root@centos-04 tmp]# seq 0 9
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- [root@centos-04 tmp]#
给用户添加密码
- [root@centos-04 tmp]# useradd user1
- [root@centos-04 tmp]# passwd user1
- 更改用户 user1 的密码 。
- 新的 密码:
- 无效的密码: 密码少于 7 个字符
- 重新输入新的 密码:
- passwd:所有的身份验证令牌已经成功更新。
- [root@centos-04 tmp]#
在脚本中自动给用户添加密码两种方式
- [root@centos-04 tmp]# echo -e "user1\nuser1\n" |passwd user1
- 更改用户 user1 的密码 。
- 新的 密码:无效的密码: 密码少于 7 个字符
- 重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
- [root@centos-04 tmp]# echo "user1" |passwd --stdin user1
- 更改用户 user1 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 12.sh
- #!/bin/bash
- for i in `seq -w 00 09`
- do
- useradd user_$i
- p=`mkpasswd -l 10 -s 0`
- echo "user_$i $p" >> /tmp/pass.tmp
- echo $p |passwd --stdin user_$i
- done
- [root@centos-04 tmp]# sh 12.sh
- 更改用户 user_00 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_01 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_02 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_03 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_04 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_05 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_06 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_07 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_08 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- 更改用户 user_09 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# tail /etc/passwd
- user_00:x:1001:1001::/home/user_00:/bin/bash
- user_01:x:1002:1002::/home/user_01:/bin/bash
- user_02:x:1003:1003::/home/user_02:/bin/bash
- user_03:x:1004:1004::/home/user_03:/bin/bash
- user_04:x:1005:1005::/home/user_04:/bin/bash
- user_05:x:1006:1006::/home/user_05:/bin/bash
- user_06:x:1007:1007::/home/user_06:/bin/bash
- user_07:x:1008:1008::/home/user_07:/bin/bash
- user_08:x:1009:1009::/home/user_08:/bin/bash
- user_09:x:1010:1010::/home/user_09:/bin/bash
- [root@centos-04 tmp]# cat /tmp/pass.tmp
- user_00 8xiwgZSce6
- user_01 yaMp6cb2gA
- user_02 jx0QtlL2fw
- user_03 69bwuqgEDf
- user_04 p3fpvMMl9c
- user_05 fm5Bv4Xssx
- user_06 ivx69zVIpy
- user_07 l77CvxvuHy
- user_08 MZfmi6kx4f
- user_09 4bAkzeaKa6
- [root@centos-04 tmp]#
登录测试(复制user_00的密码粘贴密码登录成功)
- [root@centos-04 ~]# ssh user_00@192.168.242.130
- user_00@192.168.242.130's password:
- Last login: Sat Jan 5 00:00:28 2019
- [user_00@centos-04 ~]$
删掉刚刚创建的用户
- [root@centos-04 tmp]# for i in `seq -w 00 09`;do userdel -r user_$i; done
- [root@centos-04 tmp]# tail /etc/passwd
- tcpdump:x:72:72::/:/sbin/nologin
- rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
- rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
- nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
- haproxy:x:188:188:haproxy:/var/lib/haproxy:/sbin/nologin
- dockerroot:x:994:991:Docker User:/var/lib/docker:/sbin/nologin
- epmd:x:993:990:Erlang Port Mapper Daemon:/tmp:/sbin/nologin
- rabbitmq:x:992:989:RabbitMQ messaging server:/var/lib/rabbitmq:/bin/bash
- user1:x:1000:1000::/home/user1:/bin/bash
监控httpd进程
- [root@centos-04 tmp]# vim 13.sh
- #!/bin/bash
- check_service()
- {
- c=0
- for i in `seq 1 5`
- do
- /usr/local/apache2/bin/apachectl -k restart 2> /tmp/httpd.err
- if [ ! $? -eq 0 ]
- then
- c=$[$c+1]
- else
- break
- fi
- done
- if [ $c -eq 5 ]
- then
- python mail.py "123@qq.com " "apache进程数量大于500,重启失败。" "`head -1 /tmp/httpd.err`"
- exit
- fi
- }
- while :
- do
- n=`ps -C httpd --no-heading|wc -l`
- if [ $n -ge 500 ]
- then
- check_service
- sleep 60
- n_new=`ps -C httpd --no-heading|wc -l`
- if [ $n_new -ge 500 ]
- then
- python mail.py "123@qq.com " "apache重启一分钟后进程数量仍然大于500" "请登录服务器排查问题"
- exit
- fi
- fi
- sleep 10
- done
封ip
- [root@centos-04 logs]# tail access.log
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/replicationcontrollers?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/services?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/apps/v1beta1/statefulsets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/storage.k8s.io/v1/storageclasses?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/
a452946/scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/persistentvolumes?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/
a452946/scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/extensions/v1beta1/replicasets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/nodes?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/persistentvolumeclaims?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:50 +0800] "GET /api/v1/pods?fieldSelector=status.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "
kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"- [root@centos-04 logs]#
- [root@centos-04 logs]# egrep '2018:23:46:[0-9]+' access.log |tail (这里使用egrep,因为正则中有+号)
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/replicationcontrollers?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/services?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/apps/v1beta1/statefulsets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/storage.k8s.io/v1/storageclasses?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/
a452946/scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/persistentvolumes?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/policy/v1beta1/poddisruptionbudgets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/
a452946/scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /apis/extensions/v1beta1/replicasets?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/nodes?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"
- 127.0.0.1 - - [19/Dec/2018:23:46:49 +0800] "GET /api/v1/persistentvolumeclaims?limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-" "kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/
scheduler"- 127.0.0.1 - - [19/Dec/2018:23:46:50 +0800] "GET /api/v1/pods?fieldSelector=status.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0 HTTP/1.1" 404 169 "-"
"kube-scheduler/v1.11.3 (linux/amd64) kubernetes/a452946/scheduler"- [root@centos-04 logs]#
求出上一分钟时间
- [root@centos-04 logs]# echo `date -d "-1 min" +%Y:%H:%M`
- 2019:01:39
- [root@centos-04 logs]# date
- 2019年 01月 05日 星期六 01:40:53 CST
- [root@centos-04 logs]#
查看iptables (pkts有多少个数据包,bytes有多少字节)
- [root@centos-04 tmp]# iptables -nvL
- Chain INPUT (policy ACCEPT 6947 packets, 5761K bytes)
- pkts bytes target prot opt in out source destination
- Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
- pkts bytes target prot opt in out source destination
- 46 86418 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
- 46 86418 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
- 44 86298 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
- 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
- 2 120 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
- Chain OUTPUT (policy ACCEPT 5072 packets, 1722K bytes)
- pkts bytes target prot opt in out source destination
- Chain DOCKER (1 references)
- pkts bytes target prot opt in out source destination
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:3306
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:9000
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.4 tcp dpt:80
- Chain DOCKER-ISOLATION (1 references)
- pkts bytes target prot opt in out source destination
- 46 86418 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# iptables -I INPUT -p tcp --dport 80 -s 1.1.1.1 -j REJECT (封掉1.1.1.1)
- [root@centos-04 tmp]# iptables -nvL
- Chain INPUT (policy ACCEPT 55 packets, 3968 bytes)
- pkts bytes target prot opt in out source destination
- 0 0 REJECT tcp -- * * 1.1.1.1 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
- Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
- pkts bytes target prot opt in out source destination
- 46 86418 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
- 46 86418 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
- 44 86298 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
- 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
- 2 120 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
- Chain OUTPUT (policy ACCEPT 34 packets, 3144 bytes)
- pkts bytes target prot opt in out source destination
- Chain DOCKER (1 references)
- pkts bytes target prot opt in out source destination
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:3306
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:9000
- 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.4 tcp dpt:80
- Chain DOCKER-ISOLATION (1 references)
- pkts bytes target prot opt in out source destination
- 46 86418 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
- [root@centos-04 tmp]#
- #!/bin/bash
- block_ip
- {
- t1=`date -d "-1 min" +%Y:%H:%M`
- log/data/logs/access_log
- egrep "$t1:[0-9]+" $log > /tmp/tmp_last_min.log
- awk '{print $1}' /tmp/tmp_last_min.log |sort -n |uniq -c|sort -n |awk '$1>100 {print $2}' > /tmp/bad_ip.list
- n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`
- if [ $n -ne 0 ]
- then
- for ip in `cat /tmp/bad_ip.list`
- do
- iptables -I INPUT -s $ip -j REJECT
- done
- fi
- }
- unblock_ip()
- {
- iptables -nvL INPUT |sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list
- n=`wc -l /tmp/good_ip.list|awk '{print $1}'`
- if [ $n -ne 0 ]
- then
- for ip in `cat /tmp/good_ip.list`
- do
- iptables -D INPUT -s $ip -j REJECT
- done
- fi
- iptables -Z
- }
- t=`date +%M`
- if [ $t == "00" ] || [ $t == "30" ]
- then
- unblock_ip
- block_ip
- else
- block_ip
- fi
- [root@centos-04 tmp]# vim 14.sh
将该脚本放到计划任务中每分钟执行一次
算数字
- [root@centos-04 tmp]# vim 15.sh
- #!/bin/bash
- x=10
- y=21
- for i in `seq 0 15`;
- do
- echo $x;
- x=$[$x+$y]
- z=$[2**$i] (求幂)
- y=$[$y+$z]
- done
- [root@centos-04 tmp]# sh 15.sh
- 10
- 31
- 53
- 77
- 105
- 141
- 193
- 277
- 425
- 701
- 1233
- 2277
- 4345
- 8461
- 16673
- 33077
查用户
获取linux版本
- [root@centos-04 tmp]# awk -F 'release ' '{print $2}' /etc/redhat-release |cut -d '.' -f1
- 7
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 16.sh
- #!/bin/bash
- v=`awk -F 'release ' '{print $2}' /etc/redhat-release |cut -d '.' -f1`
- user()
- {
- if [ $1 -eq 0 ]
- then
- echo "系统没有自定义的用户"
- else
- echo "系统存在自定义用户。有$1个"
- fi
- }
- case $v in
- 5|6)
- n=`awk -F ':' '$3>=500' /etc/passwd|wc -l`
- user $n
- ;;
- 7)
- n=`awk -F ':' '$3>=1000' /etc/passwd|wc -l`
- user $n
- ;;
- *)
- echo "脚本出错"
- ;;
- esac
- [root@centos-04 tmp]# sh 16.sh
- 系统存在自定义用户。有3个
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# awk -F ':' '$3 >= 1000' /etc/passwd
- nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
- user1:x:1000:1000::/home/user1:/bin/bash
- user_00:x:1001:1001::/home/user_00:/bin/bash
- [root@centos-04 tmp]#
检测磁盘
查看空间使用量和inode使用量
- [root@centos-04 tmp]# df
- [root@centos-04 tmp]# df -i
- [root@centos-04 tmp]# df |awk '{print $5}'
- 已用%
- 36%
- 0%
- 0%
- 2%
- 0%
- 34%
- 36%
- 0%
- 36%
- 0%
- 36%
- 0%
- 0%
- [root@centos-04 tmp]# df |awk '{print $5}'|sed 's/%//'
- 已用
- 36
- 0
- 0
- 2
- 0
- 34
- 36
- 0
- 36
- 0
- 36
- 0
- 0
- [root@centos-04 tmp]#
去除标头、解决有小数点的情况
- [root@centos-04 tmp]# df|sed '1d' |awk '{print $5}'|sed 's/%//'|cut -d '.' -f1
- 36
- 0
- 0
- 2
- 0
- 34
- 36
- 0
- 36
- 0
- 36
- 0
- 0
- [root@centos-04 tmp]#
最终获取大于85的命令
- [root@centos-04 tmp]# df|sed '1d' |awk -F ' +|%' '$5>85 {print $7}'
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# df|sed '1d' |awk -F ' +|%' '$5<85 {print $7}'
- /
- /dev
- /dev/shm
- /run
- /sys/fs/cgroup
- /boot
- /var/lib/docker/overlay2/ffa13b95ae63f2954be362511c25724d5b854201e405eb4913b54b80e9cf6617/merged
- /var/lib/docker/containers/f42d989248587138ac2094003ae274467518b1a15d8ead51664cc03ea0c94e59/shm
- /var/lib/docker/overlay2/53a9f09976bd64507e995cffd443f1e151fddd88c266afc416d0fb90cb90de14/merged
- /var/lib/docker/containers/c58be577ba9f3351c23c5d1d1ec9661f129aa109735d42046a9e9e465a787306/shm
- /var/lib/docker/overlay2/35bdef03d5af944aa5b87ee4d0ca692a6d4b6394f94633f26ebc78e664ca3150/merged
- /var/lib/docker/containers/e6060a8f50ed0c2455e55ae466f101226d2668a28d8e19070bf4f6b2b3c6dd73/shm
- /run/user/[root@centos-04 tmp]# vim 17.sh
- #!/bin/bash
- dir=/tmp/disk
- d=`date +%F`
- m=123@123.com
- [ -d $dir ] || mkdir $dir
- df >> $dir/$d.log
- df -i >> $dir/$d.log
- df|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df.tmp
- df -i|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df_i.tmp
- n1=`wc -l $dir/df.tmp|awk '{print $1}'`
- n2=`wc -l $dir/df_i.tmp|awk '{print $1}'`
- tag=0
- if [ $n1 -gt 0 ]
- then
- if [ $n2 -gt 0 ]
- then
- tag=11
- else
- tag=10
- fi
- else
- if [ $n2 -gt 0 ]
- then
- tag=01
- else
- tag=00
- fi
- fi
- case $tag in
- 11)
- python mail.py $m "磁盘空间和inode使用率高于85" "`cat $dir/df.tmp $dir/df_i.tmp|xargs`"
- ;;
- 10)
- python mail.py $m "磁盘空使用率高于85" "`cat $dir/df.tmp|xargs`"
- ;;
- 01)
- python mail.py $m "磁盘inode使用率高于85" "`cat $dir/df_i.tmp|xargs`"
- ;;
- *)
- ;;
- esac
检测新文件
需要任务计划执行
- [root@centos-04 tmp]# vim 18.sh
- #!/bin/bash
- basedir=/tmp/
- t=`date +%Y%m%d%H%M`
- find $basedir/ -type f -mmin -5 > /tmp/file.list
- n=`wc -l /tmp/file.list|awk '{print $1}'`
- if [ $n -gt 0 ]
- then
- mv /tmp/file.list /tmp/$t.list
- fi
- [root@centos-04 tmp]# sh 18.sh
- [root@centos-04 tmp]# ls
- 10.sh 12.sh 14.sh 16.sh 18.sh 2018-12-26.log 2.sh 456.log 5.sh 7.sh 9.sh mail.py test.sql
- 11.sh 13.sh 15.sh 17.sh 1.sh 201901050745.list 3.sh 4.sh 6.sh 8.sh disk pass.tmp tmp.SzNhh17qiE
最常用的命令
history命令调用的就是~/.bash_history文件的内容,统计最常用的10条命令
- [root@centos-04 tmp]# cat ~/.bash_history |sort |uniq -c |sort -nr |head
- 238 ls
- 34 docker ps
- 25 cd ../
- 24 docker ps -a
- 18 docker exec -it c58be577ba9f bash
- 17 docker images
- 13 docker exec -it c00e5859f876 bash
- 10 ll
- 10 docker restart c00e5859f876
- 9 ps aux|grep nginx
- [root@centos-04 tmp]#
统计文件大小
计划任务执行
时间计算
- [root@centos-04 tmp]# date -d "-16 hour" +%H
- 08
- [root@centos-04 tmp]# date +%H
- 00
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 20.sh
- #!/bin/bash
- dir=/tmp/log_stat
- t=`date +%d%H`
- t1=`date +%H`
- logdir=/data/log
- [ -f $dir/$t.log ] && rm -f $dir/$t.log
- [ -d $dir ] || mkdir $dir
- if [ $t == "00" -o $t == "12" ]
- then
- for f in `find $logdir/ -type f`
- do
- > $f
- done
- else
- for f in `find $logdir/ -type f`
- do
- du -sh $f >> $dir/$t.log
- done
- fi
计算数字个数
-e的用法
- [root@centos-04 tmp]# for i in `echo -e "123\nabc 123"`; do echo $i; done
- 123
- abc
- 123
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# wc -l 20
- 2018-12-26.log 201901050745.list 20.sh
- [root@centos-04 tmp]# wc -l 2018-12-26.log
- 14 2018-12-26.log
- [root@centos-04 tmp]# for i in `seq 1 14`; do sed -n "$i"p 2018-12-26.log; done
- 文件系统 容量 已用 可用 已用% 挂载点
- /dev/mapper/centos-root 18G 6.2G 12G 36% /
- devtmpfs 898M 0 898M 0% /dev
- tmpfs 910M 0 910M 0% /dev/shm
- tmpfs 910M 30M 881M 4% /run
- tmpfs 910M 0 910M 0% /sys/fs/cgroup
- /dev/sda1 497M 167M 331M 34% /boot
- tmpfs 182M 0 182M 0% /run/user/0
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/ffa13b95ae63f2954be362511c25724d5b854201e405eb4913b54b80e9cf6617/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/f42d989248587138ac2094003ae274467518b1a15d8ead51664cc03ea0c94e59/shm
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/53a9f09976bd64507e995cffd443f1e151fddd88c266afc416d0fb90cb90de14/merged
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/35bdef03d5af944aa5b87ee4d0ca692a6d4b6394f94633f26ebc78e664ca3150/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/e6060a8f50ed0c2455e55ae466f101226d2668a28d8e19070bf4f6b2b3c6dd73/shm
- shm 64M 0 64M 0% /var/lib/docker/containers/c58be577ba9f3351c23c5d1d1ec9661f129aa109735d42046a9e9e465a787306/shm
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# while read line; do echo $line; done < 2018-12-26.log
- 文件系统 容量 已用 可用 已用% 挂载点
- /dev/mapper/centos-root 18G 6.2G 12G 36% /
- devtmpfs 898M 0 898M 0% /dev
- tmpfs 910M 0 910M 0% /dev/shm
- tmpfs 910M 30M 881M 4% /run
- tmpfs 910M 0 910M 0% /sys/fs/cgroup
- /dev/sda1 497M 167M 331M 34% /boot
- tmpfs 182M 0 182M 0% /run/user/0
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/ffa13b95ae63f2954be362511c25724d5b854201e405eb4913b54b80e9cf6617/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/f42d989248587138ac2094003ae274467518b1a15d8ead51664cc03ea0c94e59/shm
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/53a9f09976bd64507e995cffd443f1e151fddd88c266afc416d0fb90cb90de14/merged
- overlay 18G 6.2G 12G 36% /var/lib/docker/overlay2/35bdef03d5af944aa5b87ee4d0ca692a6d4b6394f94633f26ebc78e664ca3150/merged
- shm 64M 0 64M 0% /var/lib/docker/containers/e6060a8f50ed0c2455e55ae466f101226d2668a28d8e19070bf4f6b2b3c6dd73/shm
- shm 64M 0 64M 0% /var/lib/docker/containers/c58be577ba9f3351c23c5d1d1ec9661f129aa109735d42046a9e9e465a787306/shm
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 21.sh
- #!/bin/bash
- sum=0
- while read line
- do
- line_n=`echo $line|sed 's/[^0-9]//g'|wc -L`
- echo $line_n
- sum=$[$sum+$line_n]
- done < $1
- echo "sum:$sum"
- [root@centos-04 tmp]# sh 21.sh 2018-12-26.log
- 0
- 8
- 8
- 8
- 9
- 8
- 12
- 9
- 53
- 52
- 47
- 47
- 48
- 50
- sum:359
- [root@centos-04 tmp]# head -1 2018-12-26.log
- 文件系统 容量 已用 可用 已用% 挂载点
- [root@centos-04 tmp]# tail -1 2018-12-26.log
- shm 64M 0 64M 0% /var/lib/docker/containers/c58be577ba9f3351c23c5d1d1ec9661f129aa109735d42046a9e9e465a787306/shm
- [root@centos-04 tmp]#
对比文件差异
将文件做MD5
- [root@centos-04 tmp]# md5sum 2018-12-26.log
- b11c7a1a9da1ab2b474ce5dea5e02fe1 2018-12-26.log
- [root@centos-04 tmp]#
EOF嵌入文档
第一步:传列表文件,第二步我们又写了一个脚本,第三步将脚本传到1.1.1.1机器
- [root@centos-04 tmp]# cat > 2.txt << EOF
- > 1
- > 2
- > 3
- > EOF
- [root@centos-04 tmp]# cat 2.txt
- 1
- 2
- 3
- [root@centos-04 tmp]#
- #!/bin/bash
- dir=/data/web
- [ -f /tmp/md5.list ] && rm -f /tmp/md5.list
- find $dir/ -type f > /tmp/file.list
- while read line
- do
- md5sum $line >> /tmp/md5.list
- done < /tmp/file.list
- scp /tmp/md5.list B:/tmp/
- [ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh
- cat >/tmp/check_md5.sh << EOF
- #!/bin/bash
- dir=/data/web
- n=\`wc -l /tmp/md5.list|awk '{print \$1}'\`
- for i in \`seq 1 \$n\`
- do
- file_name=\`sed -n "\$i"p /tmp/md5.list |awk '{print \$1}'\`
- md5=\`sed -n "\$i"p /tmp/md5.list|awk '{print \$2}'\`
- if [ -f \$file_name ]
- then
- md5_b=\`md5sum \$file_name\`
- if [\$md5_b != \$md5 ]
- then
- echo "\$file_name changed."
- fi
- else
- echo "\$file_name lose."
- fi
- done
- EOF
- scp /tmp/check_md5.sh B:/tmp/
- ssh B "/bin/bash /tmp/check_md5.sh"
检测网卡流量
sar命令,我们这里看第五列和第六列(8bit=1byte,100Mbit=12.5MByte/s)
- [sun.yujun@kddi-zol-php-test-web1 routes]$ sar -n DEV 1 5
- Linux 2.6.32-696.18.7.el6.x86_64 (kddi-zol-php-test-web1.zoldc.com.cn) 01/14/2019 _x86_64_ (12 CPU)
- 07:19:09 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 07:19:10 PM lo 5.00 5.00 0.50 0.50 0.00 0.00 0.00
- 07:19:10 PM eth0 13.00 6.00 0.77 0.42 0.00 0.00 0.00
- 07:19:10 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 07:19:11 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 07:19:11 PM eth0 12.00 6.00 0.71 0.73 0.00 0.00 0.00
- 07:19:11 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 07:19:12 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 07:19:12 PM eth0 12.00 5.00 0.72 0.68 0.00 0.00 0.00
- 07:19:12 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 07:19:13 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 07:19:13 PM eth0 16.83 5.94 1.00 0.74 0.00 0.00 0.00
- 07:19:13 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 07:19:14 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 07:19:14 PM eth0 8.00 3.00 0.48 0.56 0.00 0.00 0.00
- Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- Average: lo 1.00 1.00 0.10 0.10 0.00 0.00 0.00
- Average: eth0 12.38 5.19 0.74 0.62 0.00 0.00 0.00
- [sun.yujun@kddi-zol-php-test-web1 routes]$ ^C
- [sun.yujun@kddi-zol-php-test-web1 routes]$
将脚本放到crontab里面,一分钟执行一次
- [root@centos-04 tmp]# vim 23.sh
- #!/bin/bash
- logdir=/tmp/sar_log
- file=$logdir/`date +%d$H`.log
- t=`date +"%F %H:%M"`
- [ -d $logdir ] || mkdir -p $logdir
- LANG=en
- sar -n DEV 1 5 |grep eth0 |grep "Average" > /tmp/sar.tmp
- exec >>$file
- echo "$t"
- awk '{print "input:",$5*8000"bps""\n""output:",$6*8000"bps"}' /tmp/sar.tmp
- echo "###################"
- [root@centos-04 tmp]# sh 23.sh
- [root@centos-04 tmp]# ls /tmp/sar_log/
- 15.log
- [root@centos-04 tmp]# cat /tmp/sar_log/15.log
- 2019-01-15 03:48
- input: 160bps
- output: 80bps
- ###################
- [root@centos-04 tmp]#
批量杀进程
- [root@centos-04 tmp]# vim 24.sh
- #!/bin/bash
- for pid in `ps aux|grep clearnen.sh|awk '{print $2}'`;
- do
- echo $pid;
- kill -9 $pid;
- done
判断web服务
- [root@centos-04 tmp]# netstat -lntp|grep ':80 '|awk -F '/' '{print $NF}'
- nginx: master
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# lsof -i :80 |grep 'LISTEN'
- nginx 6958 root 11u IPv4 38456 0t0 TCP *:http (LISTEN)
- nginx 6959 nobody 11u IPv4 38456 0t0 TCP *:http (LISTEN)
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 25.sh
- #!/bin/bash
- n=`netstat -lntp |grep ':80 '|wc -l`
- if [ $n -eq 0 ]
- then
- echo "It not listen port 80"
- else
- ser=`netstat -lntp |grep ':80 '|awk -F '/' '{print $NF}'|sed 's/ //g'`
- echo "It is listenning port 80,and the service is $ser."
- fi
- [root@centos-04 tmp]# sh 25.sh
- It is listenning port 80,and the service is nginx:master.
- [root@centos-04 tmp]#
监控mysql服务
- [root@centos-04 tmp]# mysql -uroot -p123456 -h172.17.0.2 -e "show processlist"
- +----+------+------------------+------+---------+------+-------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+------+------------------+------+---------+------+-------+------------------+
- | 3 | root | 172.17.0.1:50676 | NULL | Query | 0 | init | show processlist |
- +----+------+------------------+------+---------+------+-------+------------------+
- [root@centos-04 tmp]#
判断是否是从数据库
- [root@centos-04 tmp]# mysql -uroot -p123456 -h172.17.0.2 -e "show slave status\G"
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 26.sh
- #!/bin/bash
- mysql = "/usr/local/mysql/bin/mysql -uroot -p123456"
- if ! $mysql -e "show processlist" >/dev/null 2>/dev/null
- then
- echo "MySql service is down."
- exit
- else
- $mysql -e "show slave status\G" 2>/dev/null >/tmp/slave.stat
- n=`wc -l /tmp/slave.stat|awk '{print $1}'`
- if [ $n -eq 0 ]
- then
- echo "This is master."
- else
- echo "This is slave."
- egrep 'Slave_10_Runing:|Slave_SQL_Running:'/tmp/slave/.stat|awk -F ': ' '{print
- $2}' > /tmp/SQL.tmp
- if grep -qw "No" /tmp/SQL.tmp
- then
- echo "The slave is down."
- fi
- fi
- fi
增删用户
- [root@centos-04 tmp]# vim 27.sh
- #!/bin/bash
- if [ $# -eq 0 ] || [ $# -gt 2 ]
- then
- echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
- exit
- fi
- ex_user()
- {
- if ! id $1 2>/dev/null >/dev/null
- then
- useradd $1 && echo "$1 add successful."
- else
- echo $1 exist.
- fi
- }
- notex_user()
- {
- if id $1 2>/dev/null >/dev/null
- then
- userdel $1 && echo "$1 delete successful."
- else
- echo $1 not exist.
- fi
- }
- case $1 in
- --add)
- if [ $# -eq 1 ]
- then
- echo "Wrong, use bash $0 --add user or bash $0 --add user1,user2,user3..."
- exit
- else
- n=`echo $2| awk -F ',' '{print NF}'`
- if [ $n -gt 1 ]
- then
- for i in `seq 1 $n`
- do
- username=`echo $2 |awk -v j=$i -F ',' '{print $j}'`
- ex_user $username
- done
- else
- ex_user $2
- fi
- fi
- ;;
- --del)
- if [ $# -eq 1 ]
- then
- echo "Wrong, use bash $0 --del user or bash $0 --del user1,user2,user3..."
- exit
- else
- n=`echo $2| awk -F ',' '{print NF}'`
- if [ $n -gt 1 ]
- then
- for i in `seq 1 $n`
- do
- username=`echo $2 |awk -v j=$i -F ',' '{print $j}'`
- notex_user $username
- done
- else
- notex_user $2
- fi
- fi
- ;;
- --help)
- if [ $# -ne 1 ]
- then
- echo "Wrong, use bash $0 --help"
- exit
- else
- echo "Use bash $0 --add username or bash $0 --add user1,user2,user3... add user."
- echo " bash $0 --del username -r bash $0 --del user1,user2,user3... delete user."
- echo " bash $0 --help print this info."
- fi
- ;;
- *)
- echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
- ;;
- esac
计算和
- #!/bin/bash
- sum=0
- for i in `seq 1 100`
- do
- j=$[$i%3]
- if [ $j -eq 0 ]
- then
- sum=$[$sum+$i]
- fi
- done
- echo $sum
加减乘除
- [root@centos-04 tmp]# vim 29.sh
- #!/bin/bash
- is_nu()
- {
- n=`echo $1 |sed 's/[0-9]//g'`
- if [ -n "$n" ]
- then
- echo "给出的参数必须是正整数"
- exit
- fi
- }
- if [ $# -ne 2 ]
- then
- echo "必须要输入两个参数"
- exit
- else
- is_nu $1
- is_nu $2
- fi
- big()
- {
- if [ $1 -gt $2 ]
- then
- echo $1
- else
- echo $2
- fi
- }
- small()
- {
- if [ $1 -lt $2 ]
- then
- echo $1
- else
- echo $2
- fi
- }
- add()
- {
- sum=$[$1+$2]
- echo "$1+$2=$sum"
- }
- jian()
- {
- b=`big $1 $2`
- s=`small $1 $2`
- cha=$[$b-$s]
- echo "$b-$s=$cha"
- }
- cheng()
- {
- ji=$[$1*$2]
- echo "$1x$2=$ji"
- }
- chu()
- {
- b=`big $1 $2`
- s=`small $1 $2`
- v=`echo "scale=2;$b/$s"|bc`
- echo "$b/$s=$v"
- }
- add $1 $2
- jian $1 $2
- cheng $1 $2
- chu $1 $2
输入数字
- [root@centos-04 tmp]# vim 30.sh
- #!/bin/bash
- while :
- do
- read -p "请输入一个数字:" n
- if [ -z "$n" ]
- then
- echo "请输入一个纯数字。"
- continue
- fi
- if echo $n |grep -qi 'end'
- then
- exit
- fi
- n1=`echo $n|sed 's/[0-9]//g'`
- if [ -n "$n1" ]
- then
- echo "请输入一个纯数字"
- continue
- else
- echo "你输入的数字是:$n"
- continue
- fi
- done
获取网卡ip
- [root@centos-04 tmp]# ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}'
- lo
- ens33
- docker0
- vethd17e886@if4
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# ip add show dev ens33 |grep ' inet '|awk '{print $2}'
- 192.168.242.130/24
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# ip add show dev ens33 |grep ' inet '|awk '{print $2}'|awk -F '/' '{print $1}'
- 192.168.242.130
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 31.sh
- #!/bin/bash
- ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/eth.list
- while :
- do
- eths=`cat /tmp/eth.list |xargs`
- read -p "Please input a if name(The eths is `echo -e "\033[31m$eths\033[0m"`): " eth
- if [ -z "$eth" ]
- then
- echo "Please input a if name."
- continue
- fi
- if ! grep -qw "$eth" /tmp/eth.list
- then
- echo "The if name is error."
- continue
- else
- break
- fi
- done
- if_ip()
- {
- ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt
- n=`wc -l /tmp/$1.txt|awk '{print $1}'`
- if [ $n -eq 0 ]
- then
- echo "There is no ip address on the eth."
- else
- echo "The ip addreess is:"
- for ip in `cat /tmp/$1.txt`
- do
- echo -e "\033[33m$ip\033[0m"
- done
- fi
- }
- if_ip $eth
列出目录内容
$@指的是1.sh 后面的一堆参数1 2 3 4 a b,$#表示所有参数的个数
- [root@centos-04 tmp]# sh 1.sh 1 2 3 4 a b
- [root@centos-04 tmp]# vim 32.sh
- #!/bin/bash
- if [ $# -eq 0 ]
- then
- ls -l .
- else
- for d in $@
- do
- echo "There are these directorys in $d:"
- find $d -type d
- done
- fi
- [root@centos-04 tmp]# sh 32.sh /tmp/ /usr/local/
- There are these directorys in /tmp/:
- /tmp/
- /tmp/.XIM-unix
- /tmp/.font-unix
- /tmp/.X11-unix
- /tmp/.ICE-unix
- /tmp/.Test-unix
- There are these directorys in /usr/local/:
- /usr/local/
- /usr/local/bin
- /usr/local/etc
- /usr/local/games
- [root@centos-04 tmp]# sh 32.sh
- 总用量 32
- -rw-r--r-- 1 root root 1771 1月 19 00:06 27.sh
- -rw-r--r-- 1 root root 122 1月 19 00:28 28.sh
- -rw-r--r-- 1 root root 742 1月 19 00:58 29.sh
- -rw-r--r-- 1 root root 343 1月 19 01:06 30.sh
- -rw-r--r-- 1 root root 765 1月 19 02:39 31.sh
- -rw-r--r-- 1 root root 134 1月 28 22:34 32.sh
- -rw-r--r-- 1 root root 33 1月 19 02:32 eth.list
- -rw-r--r-- 1 root root 10 1月 19 02:32 lo.txt
- [root@centos-04 tmp]#
- (优化版)
#!/bin/bash- if [ $# -eq 0 ]
- then
- echo "当前目录下的文件是:"
- ls -l .
- else
- for d in $@
- do
- if [ -d $d ]
- then
- echo "There are these directorys in $d:"
- find $d -type d
- else
- echo "并没有该目录:$d"
- fi
- done
- fi
下载文件
- [root@centos-04 tmp]# vim 33.sh
- #!/bin/bash
- if [ $# -ne 2 ]
- then
- echo "你必须要输入两个参数,第一个参数是网址,第二个参数是目录。"
- exit 1
- fi
- if [ ! -d $2 ]
- then
- while :
- do
- echo "你输入的第二个参数并不是一个存在的目录,是否要创建该目录呢?(y|n):"c
- case $c in
- y|Y)
- mkdir -p $2
- ;;
- n|N)
- exit 51
- ;;
- *)
- echo "请输入y或n"
- continue
- ;;
- esac
- done
- else
- cd $2
- wget $1
- if [ $? -eq 0 ]
- then
- exit 0
- else
- echo "下载失败"
- exit 52
- fi
- fi
猜数字
1.返回随机数
- [root@centos-04 tmp]# echo $RANDOM
- 15845
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# echo $[$RANDOM%101] (取0-100的数)
- 77
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 34.sh
- #!/bin/bash
- n=$[$RANDOM%101]
- while :
- do
- read -p "请输入一个0-100的数字:" n1
if [ -z "$n1" ]
then
echo "必须输入一个数字"
continue
fi
- n2=`echo $n1 |sed 's/[0-9]//g'`
- if [ -n "$n2" ]
- then
- echo "你输入的数字并不是正整数。"
- continue
- else
- if [ $n -gt $n1 ]
- then
- echo "你输入的数字小了"
- continue
- elif [ $n -lt $n1 ]
- then
- echo "你输入的数字大了"
- continue
- else
- echo "恭喜你"
- break
- fi
- fi
- done
- [root@centos-04 tmp]# sh 34.sh
- 请输入一个0-100的数字:10
- 你输入的数字小了
- 请输入一个0-100的数字:20
- 你输入的数字小了
- 请输入一个0-100的数字:50
- 你输入的数字小了
- 请输入一个0-100的数字:90
- 你输入的数字大了
- 请输入一个0-100的数字:60
- 你输入的数字小了
- 请输入一个0-100的数字:70
- 你输入的数字小了
- 请输入一个0-100的数字:80
- 你输入的数字小了
- 请输入一个0-100的数字:85
- 你输入的数字大了
- 请输入一个0-100的数字:83
- 你输入的数字小了
- 请输入一个0-100的数字:84
- 恭喜你
- [root@centos-04 tmp]#
根据名字得数字
- [root@centos-04 tmp]# vim 35.sh
- #!/bin/bash
- f=/tmp/user_number.txt
- while :
- do
- read -p "Please input a username:" u
- u1=`echo $u|sed 's/[a-zA-Z0-9]//g'`
- if [ -n "$u1" ]
- then
- echo "你输入的用户名不符合规范,正确的用户名应该是大小写字母和数字的组合"
- continue
- else
- if [ -f $f ]
- then
- u_n=`awk -v uu=$u '$1==uu {print $2}' $f`
- if [ -n "$u_n" ]
- then
- echo "用户$u对应的数字是:$u_n"
- else
- n=$[$RANDOM%100]
- echo "用户$u对应的数字是:$n"
- echo $u $n >> $f
- fi
- else
- n=$[$RANDOM%100]
- echo "用户$u对应的数字是:$n"
- echo $u $n >> $f
- fi
- fi
- done
- [root@centos-04 tmp]# sh 35.sh
- Please input a username:user1
- 用户user1对应的数字是:66
- Please input a username:user2
- 用户user2对应的数字是:45
- Please input a username:
根据名字得数字优化
- [root@centos-04 tmp]# vim 35.sh
- #!/bin/bash
- f=/tmp/user_number.txt
- jude_n()
- {
- #!/bin/bash
- f=/tmp/user_number.txt
- j_n()
- {
- while :
- do
- n=$[RANDOM%100]
- if awk '{print $2}' $f|grep -qw $n
- then
- continue
- else
- break
- n=$[$RANDOM%100]
- n=$[$RANDOM%100]
- if awk '{print $2} $f|grep -qw $n'
- fi
- done
- }
- while :
- do
- read -p "Please input a username:" u
- if [ -z "$u" ]
- then
- echo "请输入用户名"
- continue
- fi
- if [ $u == "q" ] || [ $u=="Q" ]
- then
- exit
- fi
- u1=`echo $u|sed 's/[a-zA-Z0-9]//g'`
- if [ -n "$u1" ]
- then
- echo "你输入的用户名不符合规范,正确的用户名应该是大小写字母和数字的组合"
- continue
- else
- if [ -f $f ]
- then
- u_n=`awk -v uu=$u '$1==uu {print $2}' $f`
- if [ -n "$u_n" ]
- then
- echo "用户$u对应的数字是:$u_n"
- else
- j_n
- echo "用户$u对应的数字是:$n"
- echo $u $n >> $f
- fi
- else
- j_n
- echo "用户$u对应的数字是:$n"
- echo $u $n >> $f
- fi
- fi
- done
一个数字的行
- [root@centos-04 tmp]# echo "aaaaa1bbbbb" |sed "s/[^0-9]//g"
- 1
- [root@centos-04 tmp]# echo "aaaaa1bbbbb" |sed "s/[^0-9]//g" |wc -L
- 1
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 1.txt
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- 222222222222
- fasf333
- [root@centos-04 tmp]# vim 36.sh
- #!/bin/bash
- while read line
- do
- n=`echo $line |sed 's/[^0-9]//g'|wc -L`
- if [ $n -eq 1 ]
- then
- echo $line
- fi
- done < 1.txt
日志切割归档
想要实现的效果,当有日志文件1.log.5时把1.log.5文件删除,将1.log.4文件移到为1.log.5,以此类推。
- #!/bin/bash
- cd /data/logs
- #rm 1.log.5
- #mv 1.log.4 1.log.5
- #mv 1.log.3 1.log.4
- #mv 1.log.2 1.log.3
- #mv 1.log.1 1.log.2
- #mv 1.log 1.log.1
- [root@centos-04 tmp]# vim 37.sh
- #!/bin/bash
- cd /data/logs
- log=1.log
- mv_log()
- {
- [ -f $1 ] && mv $1 $2
- }
- [ -f $log.5 ] && rm -f $log.5
- for i in `seq 4 -1 1`
- do
- j=$[$i+1]
- mv_log $log.$i $log.$j
- done
- mv 1.log 1.log.1
- #rm 1.log.5
- #mv 1.log.4 1.log.5
- #mv 1.log.3 1.log.4
- #mv 1.log.2 1.log.3
- #mv 1.log.1 1.log.2
- #mv 1.log 1.log.1
- [root@centos-04 tmp]# cd /data/logs/
- [root@centos-04 logs]# touch 1.log
- [root@centos-04 logs]# echo "111" > 1.log
- [root@centos-04 logs]# cat 1.log
- 111
- [root@centos-04 logs]# cd /tmp/
- [root@centos-04 tmp]# sh 37.sh
- [root@centos-04 tmp]# cd /data/logs/
- [root@centos-04 logs]# ls
- 1.log.1
- [root@centos-04 logs]# cat 1.log.1
- 111
- [root@centos-04 logs]# touch 1.log
- [root@centos-04 logs]# echo '000' > 1.log
- [root@centos-04 logs]# cd /tmp/
- [root@centos-04 tmp]# sh 37.sh
- [root@centos-04 tmp]# cd /data/logs/
- [root@centos-04 logs]# ls
- 1.log.1
- 1.log.2
- [root@centos-04 logs]# cat 1.log.1
- 000
- [root@centos-04 logs]# cat 1.log.2
- 111
- [root@centos-04 logs]#
查找在线IP
- [root@centos-04 tmp]# vim 38.sh
- #!/bin/bash
- for i in `seq 1 254`
- do
- if ping -c 2 -W 2 10.19.37.$i > /dev/null 2>/dev/null
- then
- echo "10.19.37.$i 是通的。"
- else
- echo "10.19.37.$i 不通。"
- fi
- done
检查脚本错误
1.-n 检查脚本错误
2.演示语法错误,我们故意给for前加一个i
- [root@centos-04 tmp]# vim 38.sh
- #!/bin/bash
- ifor i in `seq 1 254`
- do
- if ping -c 2 -W 2 10.19.37.$i > /dev/null 2>/dev/null
- then
- echo "10.19.37.$i 是通的。"
- else
- echo "10.19.37.$i 不通。"
- fi
- done
- [root@centos-04 tmp]# sh -n 38.sh
- 38.sh:行3: 未预期的符号 `do' 附近有语法错误
- 38.sh:行3: `do'
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# sh -n 38.sh > /tmp/1.txt 2> /tmp/2.txt
- [root@centos-04 tmp]# echo $?
- 2
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# cat /tmp/2.txt
- 38.sh:行3: 未预期的符号 `do' 附近有语法错误
- 38.sh:行3: `do'
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# sh 39.sh 1.sh
- sh: 1.sh: 没有那个文件或目录
- 请输入q|Q退出脚本。q
- [root@centos-04 tmp]# ls
- 1.txt 31.sh 33.sh 35.sh 37.sh 39.sh proxy.log user_number.txt
- 2.txt 32.sh 34.sh 36.sh 38.sh 456.log sh.err
- [root@centos-04 tmp]# sh 39.sh 31.sh
- 脚本31.sh没有语法错误。
- [root@centos-04 tmp]# sh 39.sh 38.sh
- 38.sh:行3: 未预期的符号 `do' 附近有语法错误
- 38.sh:行3: `do'
- 请输入q|Q退出脚本。
- #!/bin/bash
- ifor i in `seq 1 254`
- do
- if ping -c 2 -W 2 10.19.37.$i > /dev/null 2>/dev/null
- then
- echo "10.19.37.$i 是通的。"
- else
- echo "10.19.37.$i 不通。"
- fi
- done
- "38.sh" 10L, 178C 已写入
- [root@centos-04 tmp]#
格式化数字
给每个数字前面添加空格s代表替换,点当前数字&点号代表的数字。
- [root@centos-04 tmp]# echo "1234"|sed 's/./& /g'
- 1 2 3 4
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 40.sh
- #!/bin/bash
- n=`echo $1|wc -L`
- for d in `echo $1|sed 's/./& /g'`
- do
- n2=$[$n%3]
- if [ $n2 -eq 0 ]
- then
- echo -n ",$d"
- else
- echo -n "$d"
- fi
- n=$[$n-1]
- done |sed 's/^,//'
- echo
- [root@centos-04 tmp]# sh 40.sh 12345
- 12,345
- [root@centos-04 tmp]# sh 40.sh 123
- 123
- [root@centos-04 tmp]# sh 40.sh 1235555
- 1,235,555
问候脚本
获取10小时之前的时间
- [root@centos-04 tmp]# d=`date -d "-10 hours" +%H`
- [root@centos-04 tmp]# echo $d
- 17
- [root@centos-04 tmp]# vim 41.sh
- #!/bin/bash
- d=`date +%H`
- if [ $d -ge 0 -a $d -lt 7 ]
- then
- tag=1
- elif [ $d -ge 7 -a $d -lt 12 ]
- then
- tag=2
- elif [ $d -ge 12 -a $d -lt 18 ]
- then
- tag=3
- else
- tag=4
- fi
- case $tag in
- 1)
- echo "早上好"
- ;;
- 2)
- echo "上午好"
- ;;
- 3)
- echo "下午好"
- ;;
- 4)
- echo "晚上好"
- ;;
- *)
- echo "脚本出错了"
- ;;
- esac
- ~
- ~
- "41.sh" 32L, 333C 已写入
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# sh 41.sh
- 早上好
- [root@centos-04 tmp]#
菜单脚本
- [root@centos-04 tmp]# vim 42.sh
- #!/bin/bash
- PS3="Please input your choice:" 为了去掉结果中的#?
- select i in w ls pwd quit
- do
- case $i in
- w)
- w
- ;;
- ls)
- ls
- ;;
- pwd)
- pwd
- ;;
- quit)
- exit
- ;;
- *)
- echo "please input 1-3."
- ;;
- esac
- done
- "42.sh" [新] 21L, 179C 已写入
- [root@centos-04 tmp]# sh 4
- 40.sh 41.sh 42.sh 456.log
- [root@centos-04 tmp]# sh 42.sh
- 1) w
- 2) ls
- 3) pwd
- 4) quit
- #? 1
- 03:48:09 up 4 days, 8:11, 1 user, load average: 0.00, 0.01, 0.05
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 192.168.242.1 21:44 1.00s 0.26s 0.01s w
- #? 2
- 1.txt 31.sh 33.sh 35.sh 37.sh 39.sh 41.sh 456.log sh.err
- 2.txt 32.sh 34.sh 36.sh 38.sh 40.sh 42.sh proxy.log user_number.txt
- #? 3
- /tmp
- #? 4
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# echo -e "1) w\n2) ls\n3) pwd\n4)"
- 1) w
- 2) ls
- 3) pwd
- 4)
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 42-2.sh
- #!/bin/bash
- echo -e "1) w\n2) ls\n3) pwd\n4) quit"
- while :
- do
- read -p "Please input your choice(1-4):" c
- case $c in
- 1)
- w
- ;;
- 2)
- ls
- ;;
- 3)
- pwd
- ;;
- 4)
- exit
- ;;
- *)
- echo "Please input 1-4"
- ;;
- esac
- done
- "42-2.sh" 23L, 219C 已写入
- [root@centos-04 tmp]# sh 42-2.sh
- 1) w
- 2) ls
- 3) pwd
- 4) quit
- Please input your choice(1-4):1
- 04:42:46 up 4 days, 9:06, 1 user, load average: 0.00, 0.01, 0.05
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 192.168.242.1 21:44 6.00s 0.27s 0.00s w
- Please input your choice(1-4):2
- 1.txt 31.sh 33.sh 35.sh 37.sh 39.sh 41.sh 42.sh proxy.log user_number.txt
- 2.txt 32.sh 34.sh 36.sh 38.sh 40.sh 42-2.sh 456.log sh.err
- Please input your choice(1-4):
- Please input 1-4
- Please input your choice(1-4):3
- /tmp
- Please input your choice(1-4):4
- [root@centos-04 tmp]#
检查用户是否登录
思路:通过w命令获取第一列的用户
- [root@centos-04 tmp]# vim 43.sh
- #!/bin/bash
- while :
- do
- if w|sed '1'd|awk '{print $1}'|grep -qw "$1"
- then
- echo "用户$1已经登录系统"
- exit
- fi
- sleep 300
- done
- [root@centos-04 tmp]# sh 43.sh root
- 用户root已经登录系统
- [root@centos-04 tmp]#
检查系统是否入侵
- $0 当前脚本的文件名
- $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
- $# 传递给脚本或函数的参数个数。
- $* 传递给脚本或函数的所有参数。
- $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
- $? 上个命令的退出状态,或函数的返回值。
- $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件
tee
命令基于标准输入读取数据,标准输出或文件写入数据
- [root@centos-04 tmp]# vim 44.sh
- #!/bin/bash
- pp=$$
- ps -elf |sed '1'd > /tmp/pid.txt
- for pid in `awk -v ppn=$pp '$5!=ppn {print $4}' /tmp/pid.txt`
- do
- if ! [ -d /proc/$pid ]
- then
- echo "系统中并没有pid为$pid的目录,需要检查。"
- fi
- done
- [root@centos-04 tmp]# sh 44.sh
三行并一行
- [root@centos-04 tmp]# vim 45.sh
- #!/bin/bash
- n=1
- cat $1 |while read line
- do
- n1=$[$n%3]
- if [ $n1 -eq 0 ]
- then
- echo "$line"
- else
- echo -n "$line"
- fi
- n=$[$n+1]
- done
- [root@centos-04 tmp]# sh 45.sh 1.txt
- 123
- 456
- 78 3333[root@centos-04 tmp]#
网卡和ip
~就是表示用来匹配后面的正则表达式,告诉awk后面开始是正则语法。
NF 表示的是浏览记录的元素的个数
$NF 表示的最后一个Field(列),即输出最后一个字段的内容
- [root@localhost SHELL]# free -m | grep buffers\/
- -/+ buffers/cache: 1815 1859
- [root@localhost SHELL]# free -m | grep buffers\/ | awk '{print $NF}'
- 1859
- [root@localhost SHELL]# free -m | grep buffers\/ | awk '{print NF}'
- 4
- [root@localhost SHELL]#
- [root@centos-04 tmp]# ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}'
- lo
- ens33
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 46.sh
- #!/bin/bash
- ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/ifs.txt
- get_ip()
- {
- ip add show dev $1 |grep inet |awk '{print $2}' |awk -F '/' '{print $1}'
- }
- for eth in `cat /tmp/ifs.txt`
- do
- myip=`get_ip $eth`
- if [ -z "$myip" ]
- then
- echo $eth
- else
- echo $eth $myip
- fi
- done > /tmp/if_ip.txt
- if [ $# -ne 2 ]
- then
- echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip"
- exit
- fi
- if [ $1 == "-i" ]
- then
- if awk '{print $1}' /tmp/if_ip.txt |grep -qw $2
- then
- eth=$2
- ip1=`awk -v aeth=$eth '$1==aeth' /tmp/if_ip.txt|sed "s/$eth //"`
- echo "网卡$2的ip是 $ip1"
- else
- echo "你指定的网卡不对,系统中的网卡有:`cat /tmp/ifs.txt|xargs`"
- exit
- fi
- elif [ $1 == "-I" ]
- then
- if grep -qw " $2 " /tmp/if_ip.txt
- then
- eth=`grep -w " $2 " /tmp/if_ip.txt|awk '{print $1}'`
- echo "IP $2对应的网卡是$eth"
- else
- echo "你指定的ip不对,系统中的IP有:`ip add |grep inet |awk '{print $2}'|awk -F '/' '{print $1}'|xargs`"
- exit
- fi
- else
- echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip"
- fi
- [root@centos-04 tmp]# sh 46.sh
- 请输入正确的格式: bash 46.sh -i 网卡 或者 bash 46.sh -I ip
- [root@centos-04 tmp]# sh 46.sh -i eth33
- 你指定的网卡不对,系统中的网卡有:lo ens33
- [root@centos-04 tmp]# sh 46.sh -i ens33
- 网卡ens33的ip是 192.168.242.130 fe80::6244:d336:eacf:c4d6
- [root@centos-04 tmp]# sh 46.sh -i lo
- 网卡lo的ip是 127.0.0.1 ::1
- [root@centos-04 tmp]# sh 46.sh -I 192.168.242.130
- 你指定的ip不对,系统中的IP有:127.0.0.1 ::1 192.168.242.130 fe80::6244:d336:eacf:c4d6
- [root@centos-04 tmp]#
随机3位数
- [root@centos-04 tmp]# echo $RANDOM
- 26768
- [root@centos-04 tmp]# echo $[$RANDOM%10]
- 6
- [root@centos-04 tmp]# echo $[$RANDOM%10]
- 8
- [root@centos-04 tmp]# for i in `seq 0 2`; do a[$i]=$[$RANDOM%10]; done; echo ${a[@]}|sed s'/ //g'
- 203
- [root@centos-04 tmp]#
把数组按字符串输出
- echo ${a[@]}
- [root@centos-04 tmp]#vim 47.sh
- #!/bin/bash
- get_number()
- {
- for i in `seq 0 2`
- do
- a[$i]=$[$RANDOM%10]
- done
- echo ${a[@]}|sed s'/ //g'
- }
- if [ $# -eq 0 ]
- then
- get_number
- elif [ $# -eq 1 ]
- then
- n=`echo $1|sed 's/[0-9]//g'`
- if [ -n "$n" ]
- then
- echo "给定的参数必须是一个数字"
- exit
- fi
- for i in `seq 1 $1`
- do
- get_number
- done |xargs
- else
- echo "格式不对,正确的格式是sh $0 [n],这里的n是一个数字。"
- fi
- ~
- ~
- ~
- ~
- ~
- "47.sh" 28L, 414C 已写入
- [root@centos-04 tmp]# sh 47.sh
- 845
- [root@centos-04 tmp]# sh 47.sh 10
- 898 422 695 369 417 402 573 800 957 614
- [root@centos-04 tmp]#
是否安装包
查看是否安装了包,未安装的包echo $? 会输出1,安装的包输出0
- [root@centos-04 tmp]# rpm -q httpd
- httpd-2.4.6-88.el7.centos.x86_64
- [root@centos-04 tmp]# yum list|grep httpd
- Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
- httpd.x86_64 2.4.6-88.el7.centos @base
- [root@centos-04 tmp]# rpm -q mysql
- 未安装软件包 mysql
- [root@centos-04 tmp]# echo $?
- 1
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 48.sh
- #!/bin/bash
- if_install()
- {
- rpm -q $1 >/dev/null 2>/dev/null
- if [ $? -eq 0 ]
- then
- echo "$1已经安装"
- return 0
- else
- echo "$1没有安装"
- return 1
- fi
- }
- if_install httpd
- if [ $? -eq 0 ]
- then
- if ! pgrep httpd >/dev/null
- then
- service httpd start
- fi
- else
- yum install -y httpd
- fi
- if_install mysql-server
- if [ $? -eq 0 ]
- then
- if ! pgrep mysqld >/dev/null
- then
- service mysqld start
- fi
- else
- yum install -y mysql-server
- fi
- [root@centos-04 tmp]# sh 48.sh
- httpd已经安装
- Redirecting to /bin/systemctl start httpd.service
- Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
- mysql-server没有安装
- yum install -y mysql-server
- [root@centos-04 tmp]#
日期是否合法
查看日期是否在指定的月中
- [root@centos-04 tmp]# cal 02 2010
- 二月 2010
- 日 一 二 三 四 五 六
- 1 2 3 4 5 6
- 7 8 9 10 11 12 13
- 14 15 16 17 18 19 20
- 21 22 23 24 25 26 27
- 28
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# cal 02 2010
- 二月 2010
- 日 一 二 三 四 五 六
- 1 2 3 4 5 6
- 7 8 9 10 11 12 13
- 14 15 16 17 18 19 20
- 21 22 23 24 25 26 27
- 28
- [root@centos-04 tmp]# cal 02 2010|grep -w 28
- 28
- [root@centos-04 tmp]# cal 02 2010|grep -w 30
- [root@centos-04 tmp]#
- [root@centos-04 php_client]# y=2012; m=02; d=30
- [root@centos-04 php_client]# cal $m $y
- 二月 2012
- 日 一 二 三 四 五 六
- 1 2 3 4
- 5 6 7 8 9 10 11
- 12 13 14 15 16 17 18
- 19 20 21 22 23 24 25
- 26 27 28 29
- [root@centos-04 php_client]# cal $m $y|grep -w $d (grep发现没有东西,那说明我们的日期不合法)
- [root@centos-04 php_client]#
- [root@centos-04 /]# a=20180418
- [root@centos-04 /]# echo ${a:0:4}(取变量的前四个字符)
- 2018
- [root@centos-04 /]#
- ${#1} (获取参数的长度,$1的长度)
- [root@centos-04 /]# echo '2018'|grep -q "^0"
- [root@centos-04 /]# echo $?
- 1
- [root@centos-04 /]# echo '0018'|grep -q "^0"
- [root@centos-04 /]# echo $?
- 0
- [root@centos-04 /]#
- [root@centos-04 /]# vim 49.sh
- #!/bin/bash
- if [ $# -ne 1 ] || [ ${#1} -ne 8 ]
- then
- echo 'please input sh $0 yyyymmdd'
- exit 1
- fi
- y=`echo ${1:0:4}`
- m=`echo ${1:4:2}`
- d=`echo ${1:6:2}`
- if echo $d|grep -q "^0"
- then
- d=`echo ${1:6:2}|sed 's/^0//'`
- fi
- if cal $m $y > /dev/null 2>/dev/null
- then
- if ! cal $m $y |grep -qw "$d"
- then
- echo "你给的日期是不合法的"
- else
- echo "日期合法"
- fi
- else
- echo "你给的日期不合法"
- fi
- [root@centos-04 /]# sh 49.sh 20190101
- 日期合法
- [root@centos-04 /]# sh 49.sh 20190131
- 日期合法
- [root@centos-04 /]# sh 49.sh 20190132
- 你给的日期是不合法的
- [root@centos-04 /]#
监控流量
检查网卡流量
- [root@centos-04 /]# sar -n DEV 1 5 |grep ens33
- 01时42分32秒 ens33 1.01 0.00 0.06 0.00 0.00 0.00 0.00
- 01时42分33秒 ens33 1.01 1.01 0.06 0.22 0.00 0.00 0.00
- 01时42分34秒 ens33 0.99 0.99 0.06 0.21 0.00 0.00 0.00
- 01时42分35秒 ens33 1.01 1.01 0.06 0.22 0.00 0.00 0.00
- 01时42分36秒 ens33 1.00 1.00 0.06 0.21 0.00 0.00 0.00
- 平均时间: ens33 1.00 0.80 0.06 0.17 0.00 0.00 0.00
- [root@centos-04 /]#
- ▽root@centos-04 /]# vim 50.sh
- #!/bin/bash
- LANG=en
- sar -n DEV 1 10|grep -w "$1" > /tmp/sar.tmp
- in=`grep "Average:" /tmp/sar.tmp|awk '{print $5}'|sed 's/\.//'`
- out=`grep "Average:" /tmp/sar.tmp|awk '{print $6}'|sed 's/\.//'`
- if [ $in == "000" ] && [ $out == '000']
- then
- ifdown $1
- ifup $1
- fi
- [root@centos-04 /]# sh 50.sh ens33
判断网站是否正常
- [root@centos-04 /]# curl -I www.baidu.com 2>/dev/null |head -1 (加上将错误输出到null里,不加会输出下面的红色部分)
- HTTP/1.1 200 OK
- [root@centos-04 /]# curl -I www.baidu.com |head -1
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 0 277 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
- HTTP/1.1 200 OK
- [root@centos-04 /]#
- [root@centos-04 /]# curl -I www.baidu.com 2>/dev/null |head -1|awk '{print $2}'
- 200
- [root@centos-04 /]#
- [root@centos-04 tmp]# vim 50.sh
- #!/bin/bash
- #这个脚本用来判断一个网址是否正常
- url='http://www.baidu.com'
- mail_user=sun.yujun@zol.com.cn
- code=`curl -I $url 2>/tmp/curl.err|head -1|awk '{print $2}'`
- if [ -z $code ]
- then
- python mail.py $mail_user "$url访问异常" "`cat /tmp/curl.err`"
- exit
- elif [ $code != "200" ]
- then
- curl -I $url &>/tmp/curl.log
- python mail.py $mail_user "$url访问异常 状态码$code" "`/tmp/curl.log`"
- fi
- [root@centos-04 tmp]# sh -x 50.sh
- + url=http://www.baidu.com
- + mail_user=sun.yujun@zol.com.cn
- ++ curl -I http://www.baidu.com
- ++ head -1
- ++ awk '{print $2}'
- + code=200
- + '[' -z 200 ']'
- + '[' 200 '!=' 200 ']'
- [root@centos-04 tmp]#
这里发邮件需要把mail.py文件放上
小于5k文件打包
$HOME变量可以代替用户的家目录,当前登录的是哪个用户变量就指向这个用户的家目录。
- [root@centos-04 tmp]# date +%F
- 2019-03-10
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# tar zcvf 2018-02-02.tar.gz 1.txt 2.txt^C
- [root@centos-04 tmp]# find $HOME/ -type f -size -5k |xargs (xargs命令可以将打印结果放到一行)
- root@centos-04 tmp]# vim 52.sh
- #!/bin/bash
- t=`date +%F`
- cd $HOME
- tar czf $t.tar.gz `find ./ -type f -size -5k|xargs`
- [root@centos-04 tmp]# sh -x 52.sh
- ++ date +%F
- + t=2019-03-10
- + cd /root
- ++ find ./ -type f -size -5k
- ++ xargs
- + tar czf 2019-03-10.tar.gz ./.bash_logout ./.bash_profile
- [root@centos-04 home]# cd ~
- [root@centos-04 ~]# ls
- 2019-03-10.tar.gz clouddemo.py
- [root@centos-04 ~]# tar -tf 2019-03-10.tar.gz (-tf查看压缩包里的文件列表)
监控22端口是否被封
- [root@centos-04 ~]# iptables -nvL INPUT
- Chain INPUT (policy ACCEPT 123K packets, 40M bytes)
- pkts bytes target prot opt in out source destination
- [root@centos-04 ~]# iptables -I INPUT -p tcp --dport 22 -s 1.1.1.1 -j DROP
- [root@centos-04 ~]# iptables -I INPUT -p tcp --dport 22 -s 1.1.1.2 -j REJECT
- [root@centos-04 ~]# iptables -nvL INPUT
- Chain INPUT (policy ACCEPT 9 packets, 568 bytes)
- pkts bytes target prot opt in out source destination
- 0 0 REJECT tcp -- * * 1.1.1.2 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
- 0 0 DROP tcp -- * * 1.1.1.1 0.0.0.0/0 tcp dpt:22
- [root@centos-04 ~]#
- [root@centos-04 tmp]# iptables -nvL INPUT |grep -w 'dpt:22' (或者' dpt:22 ')
- 0 0 REJECT tcp -- * * 1.1.1.2 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
- 0 0 DROP tcp -- * * 1.1.1.1 0.0.0.0/0 tcp dpt:22
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# iptables -nvL INPUT |grep -w 'dpt:22' |awk '$3 ~/REJECT|DROP/' (正则匹配第三段的REJECT|DROP)
- 0 0 REJECT tcp -- * * 1.1.1.2 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
- 0 0 DROP tcp -- * * 1.1.1.1 0.0.0.0/0 tcp dpt:22
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# iptables -nvL INPUT --line-numbers |grep -w 'dpt:22' |awk '$4 ~/REJECT|DROP/ {print $1}'
- 1
- 2
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 53.sh
- #!/bin/bash
- iptables -nvL INPUT --line-numbers |grep -w 'dpt:22' |awk '$4 ~/REJECT|DROP/ {print $1}' > /tmp/iptables.log
- n=`cat /tmp/iptables.log |wc -l`
- if [ $n -gt 0 ]
- then
- for n in `tac /tmp/iptables.log`
- do
- iptables -D INPUT $n
- done
- fi
- [root@centos-04 tmp]# sh -x 53.sh
- + iptables -nvL INPUT --line-numbers
- + grep -w dpt:22
- + awk '$4 ~/REJECT|DROP/ {print $1}'
- ++ cat /tmp/iptables.log
- ++ wc -l
- + n=2
- + '[' 2 -gt 0 ']'
- ++ tac /tmp/iptables.log
- + for n in '`tac /tmp/iptables.log`'
- + iptables -D INPUT 2
- + for n in '`tac /tmp/iptables.log`'
- + iptables -D INPUT 1
- [root@centos-04 tmp]# iptables -nvL INPUT --line-numbers |grep -w 'dpt:22' |awk '$4 ~/REJECT|DROP/ {print $1}'
- [root@centos-04 tmp]#
分析日志
查看date函数用法
- [root@centos-04 logs]# man date
- [root@centos-04 logs]# 28/Jul/2018:08:04:10^C
- [root@centos-04 logs]# LANG=en
- [root@centos-04 logs]# date +%d/%b/%Y:%T
- 11/Mar/2019:04:30:44
- [root@centos-04 logs]#
核心命令
- [root@centos-04 logs]# egrep "date +%d/%b/%Y:1[01]:[0-5]:[0-9]:" /usr/local/nginx/logs/access.log |awk '{print $1}' |sort -n |uniq -c |sort -n |tail -1 |awk '{print $2}'
- [root@centos-04 tmp]# vim 54.sh
- #!/bin/bash
- #这个脚本用来分析Nginx访问日志
- #作者:SYJ
- #日期:2019-03-22
- export LANG=en
- log="/usr/local/nginx/logs/access.log"
- t=`date +%d/%b/%Y:1[01]:[0-5][0-9]:`
- egrep "$t" $log |awk '{print $1}' |sort -n |uniq -c |sort -n |tail -1 |awk '{print $2}'
打印数字
- [root@centos-04 tmp]# read -p "please: " n
- please: 4
- [root@centos-04 tmp]# echo $n
- 4
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# for i in `seq 1 $n`; do echo $i; done
- 1
- 2
- 3
- 4
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# echo $n
- 4
- [root@centos-04 tmp]# echo $n |sed 's/[0-9]//g'(判断变量中是否全是数字,将数字全都替换成空,如果还有值说明不全是数字)
- [root@centos-04 tmp]# n=a
- [root@centos-04 tmp]# echo $n |sed 's/[0-9]//g'
- a
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 55.sh
- #!/bin/bash
- #这个脚本用来打印数字
- #作者:SYJ
- #日期:2019-03-22
- read -p "Please input a number: " n
- n1=`echo $n |sed 's/[0-9]//g'`
- if [ -n "$n1" ]
- then
- echo "Please input a number."
- exit
- fi
- for i in `seq 1 $n`
- do
- echo $i
- done
- read -p "If continue? y/n" c
- case $c in
- n|N)
- exit
- ;;
- y|Y)
- read -p "Please input a number: " n2
- n3=`echo $n2 |sed 's/[0-9]//g'`
- if [ -n "$n3" ]
- then
- echo "Please input a number."
- exit
- fi
- if [ $n2 -le $n ]
- then
- echo "$n2 should grater than $n."
- exit
- fi
- for i in `seq $[$n+1] $n2`
- do
- echo $i
- done
- ;;
- *)
- echo "Please input y or n."
- ;;
- esac
- [root@centos-04 tmp]# sh 55.sh
- Please input a number: 5
- 1
- 2
- 3
- 4
- 5
- If continue? y/ny
- Please input a number: 8
- 6
- 7
- 8
- [root@centos-04 tmp]#
给文件增加内容
创建一个文件写入1、2、3、4、5、6
- [root@centos-04 tmp]# vi 1.txt
- 1
- 2
- 3
- 4
- 5
- 6
在第五列后面添加文本123456789
- [root@centos-04 tmp]# sed '5a123456789' 1.txt
- 1
- 2
- 3
- 4
- 5
- 123456789
- 6
添加\n就是回车换行加上-i参数直接修改文件
- [root@centos-04 tmp]# sed -i '5a12345\n6789' 1.txt
- 1
- 2
- 3
- 4
- 5
- 12345
- 6789
- 6
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 56.sh
- #!/bin/bash
- #这个脚本用来为文件增加行
- #作者:star
- #日期:2019-03-25
- n=0
- cat 1.txt |while read line
- do
- n=$[$n+1]
- if [ $n -eq 5 ]
- then
- echo $line
- echo -e "# This is a test file.\n# Test insert line into this file."
- else
- echo $line
- fi
- done
- [root@centos-04 tmp]# sh 56.sh
- 1
- 2
- 3
- 4
- 5
- # This is a test file.
- # Test insert line into this file.
- 6
- [root@centos-04 tmp]#
备份etc目录
- [root@centos-04 tmp]# date +%d
- 11
- [root@centos-04 tmp]# date +%y
- 19
- [root@centos-04 tmp]# date +%Y
- 2019
- [root@centos-04 tmp]# date +%y%m%d
- 190311
- [root@centos-04 tmp]# date +%Y%m%d
- 20190311
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# date +%F
- 2019-03-11
- [root@centos-04 tmp]#
自动添加shell脚本注释
- [root@centos-04 tmp]# vim add_title.sh
- #!/bin/bash
- d=`date +%F`
- cat >$1<<EOF
- #!/bin/bash
- #这个脚本用来
- #作者:SYJ
- #日期:$d
- EOF
- [root@centos-04 tmp]# sh add_title.sh 57.sh
- [root@centos-04 tmp]# vim 57.sh
- #!/bin/bash
- #这个脚本用来
- #作者:SYJ
- #日期:2019-03-11
- [root@centos-04 tmp]# vim 57.sh
- #!/bin/bash
- #这个脚本用来备份/etc/目录
- #作者:SYJ
- #日期:2019-03-11
- d1=`date +%d`
- d2=`date +%y%m%d`
- if [ $d1 == "01" ]
- then
- cd /etc/
- tar -czf "/root/bak/${d2}_etc.tar.gz" ./
- fi
- [root@centos-04 tmp]# sh 57.sh
- [root@centos-04 tmp]# cd /root/bak/
- [root@centos-04 bak]# ls
- 190301_etc.tar.gz
- [root@centos-04 bak]#
找出重复的单词
将非字母的字符全部替换成空格
- [root@centos-04 tmp]# cat /etc/passwd |sed 's/[^a-zA-Z]/ /g'
- root x root root bin bash
- bin x bin bin sbin nologin
将字母放到一列
- [root@centos-04 tmp]# for w in `cat /etc/passwd|sed 's/[^a-zA-Z]/ /g'`; do echo $w; done
- root
- x
- root
- root
- bin
- bash
- bin
- x
- bin
- [root@centos-04 tmp]# for w in `cat /etc/passwd|sed 's/[^a-zA-Z]/ /g'`; do echo $w; done |sort |uniq -c|sort -nr |head
- 34 x
- 33 sbin
- 27 nologin
- 14 var
- 8 bin
- 7 lib
- 6 user
- 5 User
- 4 systemd
- 4 root
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# sh add_title.sh 58.sh
- [root@centos-04 tmp]# vim 58.sh
- #!/bin/bash
- #这个脚本用来找出重复的单词
- #作者:SYJ
- #日期:2019-03-11
- for w in `sed 's/[^a-zA-Z]/ /g' $1`
- do
- echo $w
- done |sort |uniq -c |sort -nr |head
- [root@centos-04 tmp]# sh 58.sh /etc/passwd
- 34 x
- 33 sbin
- 27 nologin
- 14 var
- 8 bin
- 7 lib
- 6 user
- 5 User
- 4 systemd
- 4 root
- [root@centos-04 tmp]#
人员分组
首先需要有一个人员列表文件
- [root@centos-04 tmp]# vim member.txt
- aaaaaaa
- bbbb
- ccccc
- dddddddd
- eeeeeeeeeee
- ffffff
- gggggggg
- hhhhhhhhh
需要安装bc命令,bc命令是linux下面的计算器
- [root@centos-04 tmp]# yum install -y bc
计算一个字符cksum的值(是一串数字)
- [root@centos-04 tmp]# echo adfasdf |cksum
- 3506188467 8
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# echo -e "1\n2\n3\n4\n5"|shuf (shuf打乱列顺序)
- 3
- 2
- 5
- 4
- 1
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 59.sh
- #!/bin/bash
- #这个脚本用来人员分组
- #作者:SYJ
- #日期:2019-03-11
- #人员列表文件
- f=member.txt
- #小组数
- group_n=3
- #人员总数
- member_n=`wc -l $f |awk '{print $1}'`
- #根据姓名计算该用户所在小组的id
- get_n()
- {
- #根据姓名计算cksum值
- l=`echo $1 |cksum|awk '{print $1}'`
- #获取一个随机数
- n1=$RANDOM
- #cksum值和随机数相机,然后除以小组数取余,这样可以确保每次获取到的余数都不一样
- n2=$[$n1+$l]
- g_id=$[$n1%$group_n]
- #假如小组数为7,则余数范围0-6,如果余数为0,则小组为7
- if [ $g_id -eq 0 ]
- then
- g_id=$group_n
- fi
- echo $g_id
- }
- for i in `seq 1 $group_n`
- do
- #n_$i.txt为临时文件,用来记录该小组内的成员
- #脚本之前执行过,则该文件会存在,本次执行脚本前应该删除掉这个临时文件
- [ -f n_$i.txt ] && rm -f n_$i.txt
- done
- shuf $f |while read name
- do
- #计算用户所在小组的id
- g=`get_n $name`
- #将人员追加写入到他对应的小组里
- echo $name >> n_$g.txt
- done
- #定义计算文件行数的函数
- nu(){
- wc -l $1 |awk '{print $1}'
- }
- #获取组员人数最多的小组
- max(){
- ma=0;
- for i in `seq 1 $group_n|shuf`
- do
- n=`nu n_$i.txt`
- if [ $n -gt $ma ]
- then
- ma=$n
- fi
- done
- echo $ma
- }
- #获取组员人数最少的小组
- min(){
- mi=$member_n
- for i in `seq 1 $group_n|shuf`
- do
- n=`nu n_$i.txt`
- if [ $n -lt $mi ]
- then
- mi=$n
- fi
- done
- echo $mi
- }
- #定义四舍五入函数
- div(){
- n=`echo "scale=1;$1/$2"|bc`
- n1=`echo "scale=1;$n+0.5"|bc`
- echo $n1|cut -d. -f1
- }
- #小组组员平均值(非四舍五入)
- ava_n=$[$member_n/$group_n]
- #小组组员平均值(四舍五入)
- ava_n1=`div $member_n $group_n`
- if [ $ava_n -eq $ava_n1 ]
- then
- #定义初始最小值
- ini_min=1
- #以下while循环要做的事情,就是要把人数多的组里的人搞到人数少的组里去
- #此while循环的条件是,当人数最少的组成员数小于组员平均值
- while [ $ini_min -lt $ava_n1 ]
- do
- #找出人数最多的组
- m1=`max`
- #找出人数最少的组
- m2=`min`
- for i in `seq 1 $group_n|shuf`
- do
- n=`nu n_$i.txt`
- #找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
- if [ $n -eq $m1 ]
- then
- f1=n_$i.txt
- #找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
- elif [ $n -eq $m2 ]
- then
- f2=n_$i.txt
- fi
- done
- #取f1中最后一个人名
- name=`tail -n1 $f1`
- #将这个人名追加写入f2中
- echo $name >> $f2
- #在f1中删除刚刚取走的人名
- sed -i "/$name/d" $f1
- #把此时的最少组人员数赋值给ini_min
- ini_min=`min`
- done
- else
- #定义初始最大值
- ini_max=$member_n
- while [ $ini_max -gt $ava_n1 ]
- do
- #找出人数最多的组
- m1=`max`
- #找出人数最少的组
- m2=`min`
- for i in `seq 1 $group_n|shuf`
- do
- n=`nu n_$i.txt`
- #找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
- if [ $n -eq $m1 ]
- then
- f1=n_$i.txt
- #找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
- elif [ $n -eq $m2 ]
- then
- f2=n_$i.txt
- fi
- done
- #取f1中最后一个人名
- name=`tail -n1 $f1`
- #将这个人名追加写入f2中
- echo $name >> $f2
- #在f1中删除刚刚取走的人名
- sed -i "/$name/d" $f1
- #把此时的最少组人员数赋值给ini_min
- ini_max=`max`
- done
- fi
- for i in `seq 1 $group_n`
- do
- echo -e "\033[34m$i 组成员有:\033[0m"
- cat n_$i.txt
- #把临时文件删除
- rm -f n_$i.txt
- echo
- done
- [root@centos-04 tmp]# sh 59.sh
- 1 组成员有:
- aaaaaaa
- eeeeeeeeeee
- ffffff
- 2 组成员有:
- hhhhhhhhh
- bbbb
- 3 组成员有:
- dddddddd
- gggggggg
- ccccc
- [root@centos-04 tmp]#
比较两个数大小
bc命令返回1代表成立,返回0代表不成立
- [root@centos-04 tmp]# x=10.1; y=11
- [root@centos-04 tmp]# echo "$x > $y"|bc
- 0
- [root@centos-04 tmp]# echo "$x < $y"|bc
- 1
- [root@centos-04 tmp]#
- [root@centos-04 tmp]# vim 60.sh
- if_number()
- {
- if echo $1|grep -q '^-'
- then
- nu=`echo $1|sed 's/^-//'`
- else
- nu=$1
- fi
- n=`echo $nu|sed 's/[0-9.]//g'`
- if [ -n "$n" ]
- then
- echo "$1不是合法数字。"
- exit
- fi
- if echo $1|grep -q '^\.'
- then
- echo "$1不是合法数字。"
- exit
- fi
- }
- if_number $1
- if_number $2
- n1=`echo "$1>$2"|bc`
- if [ $n1 -eq 1 ]
- then
- echo "$1 > $2"
- else
- if [ "$1" == "$2" ]
- then
- echo "$1=$2"
- else
- echo "$1 < $2"
- fi
- fi
- [root@centos-04 tmp]# sh 60.sh -100 -10
- -100 < -10
- [root@centos-04 tmp]# sh 60.sh 100 10
- 100 > 10
- [root@centos-04 tmp]#
Shell习题100例的更多相关文章
- Shell习题100例(2)
找文件差异 grep -f 选项可以匹配到文件a在文件b中所有相关的行(取a中有b中有的) [root@centos-04 tmp]# vim b.txt vvvv root [root@centos ...
- linux shell习题训练
shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2 ...
- C语言程序设计100例之(14):丑数
例14 丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个 ...
- shell习题训练
shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2 ...
- Python语言100例
Python版本:python 3.2.2 电脑系统:win7旗舰 实例来源:python菜鸟教程100例 #!/usr/bin/python # -*- coding: UTF-8 -*- impo ...
- C语言经典算法100例
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...
- 实用ExtJS教程100例-001:开天辟地的Hello World
ExtJS功能繁多,要想彻底的了解确实很困难.作为初学者,如何能找到一条快速的通道呢?我觉得,如果你有Javascript的基础,那就不要惧怕ExtJS的复杂,从动手开始,遇到问题,解决问题,积累经验 ...
- C 语言经典100例
C 语言经典100例 C 语言练习实例1 C 语言练习实例2 C 语言练习实例3 C 语言练习实例4 C 语言练习实例5 C 语言练习实例6 C 语言练习实例7 C 语言练习实例8 C 语言练习实例9 ...
- Xena L23网络测试仪Valkyrie使用技巧100例,目录
Xena L23网络测试仪Valkyrie使用技巧100例,先写个目录 100例,会不会有点多,写不完... ^_^ 第1次编辑于2019-11-27 22:05:52, Evan YE. 编号 标题 ...
随机推荐
- VB.NET与C# 语法区别展示
在学习VB.NET后发现,VB.NET与C#的语法主要的不同在两个部分,这两部分搞通了,那就游刃有余,迎刃而解了.现将其对比总结如下: 一.实体部分 (与VB相比,在C#和VB.NET中,实体的使用很 ...
- LigerUI之Grid使用详解(三)——字典数据展示
一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.在关于LigerGrid的前两篇的内容里,给大家 ...
- 【Word】Word 2010 设置边框底纹,粘贴漂亮的代码
参考资料: http://jingyan.baidu.com/article/48206aea1a3401216bd6b310.html http://wenku.baidu.com/link?url ...
- Style 的查找 FindResource
1)根据名称查找 PrintPreview fe = new PrintPreview(new Summary()); string strResourceHeader = "headerS ...
- word图片自动编号与引用(转)
http://blog.csdn.net/hunauchenym/article/details/5915616 用Word时,可能会遇到文中使用了大量的图片的情况,这时,若采用手动为图片编号的方法, ...
- Linux kernel模块管理相关详解
Linux内核模块化设计 1. Linux内核设计:单内核.模块化(动态装载和卸载) (1) Linux:单内核设计,但充分借鉴了微内核体系的设计的优点:为内核引入了模块化机制:(2) 内核的组成部分 ...
- 菜鸟运维笔记:小记编译安装Nginx所遇到的坑
转载请注明出处:http://blog.csdn.net/guodongxiaren/article/details/40950249 谢谢合作 前言 无论是CentOS,或是Debian/Ubunt ...
- swift语言实现单例模式
Swift实现单例模式 单例模式在各个语言中都有实现,swift语言推出已经几天了.通过这几天的看文档.特奉上写的Swift的单例实现,供大家学习交流,欢迎指正. ---若转载请注明出处,本人Gith ...
- Eclipse中SVN修改的*星号没了,解决方法
Eclipse中SVN修改的*星号没了,解决方法 打开Preference 第一步:去掉外加的 ">" 第二步:勾选Outgoing changes 这样做之后," ...
- 【IPC进程间通讯之二】管道Pipe
IPC进程间通信+管道Pipe IPC(Inter-Process Communication.进程间通信). 管道用于进程间共享数据,事实上质是共享内存 ...