运维工作常用的shell命令

时间:2022-04-28
本文章向大家介绍运维工作常用的shell命令,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

#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 "33[41m A 33[0m"  输出红背景的A
 A 
[root@desktop12 Desktop]# echo -e "33[31m A 33[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