运维工作常用的shell命令

Author by :Andy-xu
Blog:my.oschina.net/xxbAndy/blog


#seq 1 100    //1到100排序
#seq 1 3 100   //1到100排序,间隔为3

shell中的变量设置规则:
1.变量与变量的内容用"="链接;
2.等号两边不能直接接空格
3.变量只能是英文字母与数字(必须以字母开头)
4、变量内容若有空格符可以使用双引号或者单引号将变量结合起来(注意:双引号中的特殊字符$,可以保持原有特性,单引号的特殊字符仅作为一般字符)
 #awk -F '{print $"$i"}'
5.若该变量需要在其他子程序执行,则需要以export来使变量变成环境变量(自定义变量转变成环境变量)
注意:子进程会继承父进程的(使用bash或sh切换到子shell)
 #export name   加载name环境变量
6.shell内置的环境变量的含义:
$? 返回上一个进程的返回值
$$  返回当前运行进程的PID
$!  后台进行的最后一个进程的PID

7.查看进程的方式:
#ps -aux / #top /#pstree  /#netstat -antlp
8.杀死进程
#kill /#pkill  / #killall
9.通过程序查找进程的PID
#pgrep -l http  显示程序的名字和进程PID(-o显示起始进程PID;-n显示终止进程PID)
10.进程的调度:
#nohup     退出系统后可以继续运行某个程序。(可以启动一个要运行几天甚至几周的进程)
#renice    通过修改进程的优先值,调度进程的发生
#at,crontab  通过定时处理相关的程序调度
#kill      中断一个后台进程进行相应的调度


####################################3系统全面查看工具:###############################################
11.linux下查看网络流量的命令:
#sar -n DEV 1 4 (查看网络接口,每一秒查看一次,查找4次)  #sysstat包(sar系统活动情况报告)
-n 选项提供6个不同的开关:DEV|EDEV|NFS|NFSD|SOCK|ALL
DEV:显示网络接口信息
EDEV:显示关于网络错误的统计数据
NFS:统计活动NFS客户端
NFSD:统计NFS服务器端
SOCK:统计套接字
ALL:统计所有
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxkb/s:每秒钟接收的字节数
txkb/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包    
[root@node2 ~]# sar -n DEV 2 2
Linux 2.6.32-431.el6.x86_64 (node2.example.com)         09/26/2014      _x86_64_        (1 CPU)
10:24:51 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
10:24:53 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:24:53 AM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:24:53 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
10:24:55 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:24:55 AM      eth0      0.50      0.50      0.03      0.19      0.00      0.00      0.00
Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0      0.25      0.25      0.01      0.09      0.00      0.00      0.00

sar的详细用法:
sar [options] [-A] [-o file] t [n]
t 为采样间隔,n为采样次数,默认为1;
-o file 表示将命令结果以二进制文件存储在文件中
options表示命令选项:
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-c:输出进程统计信息,每秒创建的进程数
##############################################################################################

12.网络数据采集分析工具:tcpdump
#tcpdump -i eth0   监视指定网络接口的数据包
#tcpdump host  IP  指定固定IP 进行获取相应的数据包
#tcpdump host 10.0.0.1 and \ (ip1 or ip2\)  截获10.0.1主机和ip1或ip2的通信
#tcpdump -i eth0 src host name   截获主机name发送的所有数据
#tcpdump -i eth0 dst host name   监视所有送到主机name的数据包
#tcpdump tcp port 23 host ip1    截取主机IP1接受或发出的telnet包
注意:好像还有ifstat,nload,iptraf等工具可以使用

13.查看网络连接状况:
#w    (查看链接到本机的)
#netstat -ant   (查看本机连接)

 

查看/boot使用率  (可以使用这个统计磁盘使用率,并进行报警)
#df -T | grep /boot | awk '{print $6}' |awk -F % '{print $1}'
#df -T | grep /boot | awk '{print $6}' |cut -d% -f 1


批量替换
[root@desktop51 Desktop]# sed -i "s/xx/co/g" /root/lines

[root@desktop51 ~]# grep ich /usr/share/mime/packages/freedesktop.org.xml | sed 's/[ ]*//g' > /root/xx       这个是替换所有的空格g表示全文
[root@desktop51 ~]# grep ich /usr/share/mime/packages/freedesktop.org.xml | sed 's/[ ]*//' > /root/lines           这个呢只是替换行前面的空格

 

root@desktop51 ~]# du --exclude=*.iso /var/ftp/pub/ -sh   统计pub目录里不包含.iso的文件并统计大小


find使用详解:

-name   filename             #查找名为filename的文件
-perm                        #按执行权限来查找
-user    username             #按文件属主来查找
-group groupname            #按组来查找
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n               #按文件访问时间来查GIN: 0px">

-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前
-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件

find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件

[root@desktop51 Desktop]# find -type f -exec du {} \; | sort -nr | head -3
600 ./RH135/RH135-13 安装和管理软件.pdf
536 ./RH135/RH135-12 管理SELINUX.pdf
452 ./RH135/RH135-5 网络配置和排错.pdf

-n
是显示升序


3.查找一个文件出现频率最高的是个词
cat words.txt | sort | uniq -c | sort -k1,1nr | head -10
  主要考察对sort、uniq命令的使用,相关解释如下,命令及参数的详细说明请自行通过man查看,简单介绍下以上指令各部分的功能:

sort:  对单词进行排序

uniq -c:  显示唯一的行,并在每行行首加上本行在文件中出现的次数

sort -k1,1nr:  按照第一个字段,数值排序,且为逆序

head -10:  取前10行数据

[root@desktop51 ~]# cat .bash_history | sort | uniq -c | sort -k1,1nr |head -3
    173 ls
     25 cd ..
     22 mail


找出用户和id  最后5个
[root@desktop51 ~]# awk -F: '{print $1":"$3}' /etc/passwd | tail -5
postgres:26
jboss:496
rhevm:109
vdsm:36
test:501
[root@desktop51 ~]# awk -F: '{print $1"\t" $3}' /etc/passwd | tail -5
postgres 26
jboss 496
rhevm 109
vdsm 36
test 501


[root@desktop51 ~]# df -h | grep / | head -1 | awk '{print $5}'
60%
[root@desktop51 ~]# df -h | grep /$   以/结尾的
/dev/sda2              73G   42G   28G  60% /
[root@desktop51 ~]# df -h | grep /$ | awk '{print $5}' | awk -F% '{if ($1>50) {print "根分区使用大于50%"} else {print "根分区使用小于50%"}}'
根分区使用大于50%
[root@desktop51 ~]# df -h | grep /#
[root@desktop51 ~]# df -h | grep /$
/dev/sda2              73G   42G   28G  60% /
[root@desktop51 ~]#
4.
[root@desktop51 ~]# uptime | cut -d, -f1 | awk '{print $3}' | awk -F: '{print " 系统运行了"$1"小时"$2"分钟"}'
系统运行了2小时58分钟

#cat /var/log/secure | awk '/Failed/{print $(NF-3)}'     打印倒数第四个
注意:这样统计的是每个ip的访问次数,记住有些ip可能多次访问,因此需要进行整理数据
#sort |uniq -c    进行排序,并且统计ip的个数


5.
[root@desktop51 ~]# netstat -antlp | grep LISTEN
tcp        0      0 0.0.0.0:50725               0.0.0.0:*                   LISTEN      1873/rpc.statd     
tcp        0      0 127.0.0.1:5900              0.0.0.0:*                   LISTEN      11790/qemu-kvm     
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1715/rpcbind       
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      2502/dnsmasq       
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2137/sshd          
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1926/cupsd         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2247/master        
[root@desktop51 ~]# netstat -antlp | grep LISTEN | awk '{print $NF}'
1873/rpc.statd
11790/qemu-kvm
1715/rpcbind                       在awk中$NF表示最后一列? -F指定分割符默认空格
2502/dnsmasq
2137/sshd
1926/cupsd
2247/master

输出只监听的进程和pid
[root@desktop51 ~]# netstat -antlp | grep LISTEN | awk '{print $NF}' | sort -u | awk -F/ '{print $2 "("$1")"}'
qemu-kvm(11790)
rpcbind(1715)
rpc.statd(1873)
cupsd(1926)
sshd(2137)
master(2247)
dnsmasq(2502)

只输出设备的ip和netmask
[root@desktop51 ~]# ifconfig  | grep inet | awk '{print $2":"$4}' | awk -F: '{print $2 "/"$4}'
192.168.0.51/255.255.255.0
127.0.0.1/
192.168.122.1/255.255.255.0
akw语言用-F指定分割符,默认不写表示的是空格

 


30-31是字体颜色
40-41是背景颜色
[root@desktop12 Desktop]# echo -e "\033[41m A \033[0m"  输出红背景的A
 A
[root@desktop12 Desktop]# echo -e "\033[31m A \033[0m"  输出红字体A
 A

 


#echo $RANDOM|md5sum | cut -c 1-8   加密字符串8个(一般可以作为用户密码)
 
 使用 ip 的ping测试,可以将在线和线下的输出直接>>到一个文件日志里面。在执行ip测试脚本的时候直接使用后台进行执行。
 
 
 
 解决ddos攻击生产案例脚本:
 #!/bin/bash
 for a in `netstat -antlp | grep ES |awk '{print $5}'|cut -d: -f1 | uniq -c | sort -r |awk '$1 > 100 {print$2}'`
 do
  iptables -A INPUT -s $a -j DROP
 done
 
mysql多实例启动脚本:(启动和关闭命令已知)使用函数,case,if
#!/bin/bash
function start(){
mysqld_safe --default-file=/data/3306/my.cnf &
 }
 function stop(){
 mysqladmin -u root -pxxbandy -S /data/3306/mysql.sock shutdown
 }
 case "$1" in
  start)
   start
   ;;
  stop)
   stop
   ;;
  *)
   exit 3
   ;;
 esac
 
 
 
 
 
 变量赋值 变量=值
乘法 expr 3 \* 5
     var1=3
     expr $var1 \* 10
赋值乘法
    var2=`expr $var1 \* 3`       //注意前提是var1有值
    echo $var2    显示var2的值为9
a=10 b=3 c=9
     expr $a + $b + $c          //输出a+b+c的值
     d=`expr $a + $b + $c`      //将计算结果赋值给d
     echo $d
     

打印星星:
#/bin/bash
for i in `seq 1 23`
do
 spaceNumber=`expr 20 + $i`
 for j in `seq 1 $spaceNumber`
 do
  echo -n ' '
 done
 
 startNumber=`expr 48 - 2 \* $i - 1`
 for k in `seq 1 $startNumber`
 do
  echo -n '*'
 done
 echo
done

你可能感兴趣的:(运维工作常用的shell命令)