Linux自动化运维之Shell脚本(登堂入室)

简介:

基本正则表达式 (使用一些特殊符号来表达)
^ 开始
$ 结尾
[ ] 集合中任意单个符号
[^ ] 对集合取反
. 任意单个符号

  • 匹配前一个字符出现任意次(0次或多次)
    .* 匹配所以
    {n,m} 匹配前一个字符出现了n到m次
    {n,} 匹配前一个字符出现了n次或n次以上
    {n} 匹配前一个字符出现n次

扩展正则(优化基本,添加新的)
{n,m}
{n,}
{n}
将*拆成了+ ?

  • 匹配 1 次或多次
    ? 匹配 0 或 1 次
    () 整体
    | 或者
    \b 匹配单词边界
    \B 匹配非单词边界
    \< 匹配指定单词开头
    \> 匹配指定单词结尾

    [root@room1pc32 正则表达式]# grep "test" test.txt 
    this is a test file
    testisgood
    goodtest haha
    [root@room1pc32 正则表达式]# grep "\btest\b" test.txt 
    this is a test file
    [root@room1pc32 正则表达式]# grep "\btest" test.txt 
    this is a test file
    testisgood
    [root@room1pc32 正则表达式]# grep "test\b" test.txt 
    this is a test file
    goodtest haha

基本正则:兼容性强,书写麻烦
扩展正则:兼容性差,书写简单
egrep 可以使用扩展的正则表达式
grep -E 表示使用扩展的正则表达式
extended register
扩充寄存器
grep [a]{1,4}
等同于
grep -E [a]{1,4}
-c 返回匹配的行数
-o 显示一行中与指定模式匹配的部分
grep -Ec 条件 #显示匹配行数
grep -Eo 条件 | wc -l #显示可得到匹配的实际数目

sed 非交互文本编译器(流处理器)
sed [选项] '条件指令' 文件
选项:
-n 屏蔽sed默认输出
-r 开启扩展正则
-i 修改源文件
条件:
1.行号

    [root@A ~]# sed -n '1p' /etc/passwd     #打印第一行
    root:x:0:0:root:/root:/bin/bash 
    [root@A ~]# sed -n '1,3p' /etc/passwd   #打印 1,2,3 行
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

2.正则表达式

[root@A ~]# sed -nr '/^test:/p' /etc/passwd  #/../之中输入正则 p 为打印
test:x:3468:3468::/home/test:/bin/bash

指令:(增 删 改 查)
p 打印
d 删除
s 替换 s/旧/新/
s # 新 # 旧 # #可变
注意事项:替换符号可以是任意其他符号
a append 追加 之后加一行
i insert 插入 之前加一行
c 替换行change
r 导入
w 另存为 
H/h 复制
G/g 粘贴

() 保留,复制
\ 粘贴
例:

[root@A ~]# sed 'd' /etc/passwd
[root@A ~]# sed '/bash$/d' /etc/passwd  #显示删除后的

[root@A ~]# sed  's/2012/666/' a.txt    #默认替换每行的第一个
666 2011 2012
2018 666
2013
666 2012 2012
[root@A ~]# sed  's/2012/666/g' a.txt   #替换全部
666 2011 666
2018 666
2013
666 666 666
[root@A ~]# sed  's/2012/666/2' a.txt   #替换第二个
2012 2011 666
2018 2012
2013
2012 666 2012
[root@A ~]# cat 1.txt 
98969 9899 9869 98969
[root@A ~]# sed 's9\98\9\99\96\99' 1.txt
98969 969 9869 98969

[root@A ~]# vim test.txt
[root@A ~]# cat test.txt
ni hao nb
welcome to beijing
1.把第一个字符和最后一个字符对调
[root@A ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/' test.txt
bi hao nn
gelcome to beijinw
2.把第二个字符和倒数第二个字符对调
^(.)(.)(.*)(.)(.)$  \1\4\3\2\5

[root@A ~]# sed 'a666 1' test.txt 
12
666 1
[root@A ~]# sed 'i666 1' test.txt 
666 1
12
[root@A ~]# sed 'c666 1' test.txt 
666 1

[root@A ~]# sed 'r /etc/hosts' a.txt 
    a.txt的每一行下导入/etc/hosts 的内容
[root@A ~]# sed '2r /etc/hosts' a.txt 
    a.txt的第二行下导入/etc/hosts 的内容
[root@A ~]# sed  -i 'w /b.txt' a.txt        #全文另存为
[root@A ~]# sed  -i '3w /c.txt' a.txt   #仅第三行另存为
[root@A ~]# cat /b.txt 
2012 2011 2012
2018 2012
2013
2012 2012 2012
[root@A ~]# cat /c.txt
2013
[root@A ~]# sed '2H;3G' a.txt 
2012 2011 2012
2018 2012
2013                #G 为追加粘贴 

2018 2012
2012 2012 2012

练习:
1)把/etc/paswd/中能登录的用户找出来
#!/bin/bash
sed -n '/bash$/p' /etc/passwd > tmp.txt
for i in cat tmp.txt
do
echo ${i%%:*}
done

#!/bin/bash
sed -n '/bash$/s/:.*//p' /etc/passwd

2)把/etc/shadow中的密码显示

#!/bin/bash
A=`sed -n '/bash$/s/:.*//p' /etc/passwd` &> /dev/null
for i in $A 
do
    p1=`grep "$i" /etc/shadow`
    p2=${p1#*:}
    p3=${p2%%:*}
    echo "$i:$p3"
done

awk 数据过滤,统计(行,列)
逐行处理器
awk [选项] '条件{指令}' 文件
命令 | awk [选项] '条件{指令}'

[root@A ~]# free | awk '/Mem/{print $4}'    #查看内存
[root@A ~]# ifconfig eth0 | awk '/RX p/{print $5}' #查看网卡流量
[root@A ~]# tailf /var/log/secure   #监控 远程登录 日志文件

选项:
-F 指定分隔符 #默认分隔符为空格和(TAB)
[root@A ~]# awk -F: '{print $1}' /etc/passwd

awk 内置变量
$1 $2 $3.. #某一列
NF #当前行有多少列
NR #当前行号

[root@A ~]# awk -F: '{print NR}' /etc/passwd
[root@A ~]# awk -F: '{print NF}' /etc/passwd
[root@A ~]# awk -F: '{print $NF}' /etc/passwd   #打印最后一列
[root@A ~]# awk '{print "nh","nb","nm"}' /etc/passwd  #打印常量(必须用双引号)
[root@A ~]# awk -F: '{print "用户名为:",$1}'  /etc/passwd
用户名为: root
用户名为: bin
...

awk [选项] 'BEGIN{} 条件{} END{}' 文件
原则:所有的指令必须放在{}
BEGIN{}:指令在读取文件内容前执行1次
条件{}: 指令在读取文件后中执行n次
END{}: 指令在读取文件后执行1次

[root@A ~]# awk 'BEGIN{print "nihao"}' a.txt
nihao
[root@A ~]# awk '{print "nihao"}' a.txt 
nihao
nihao
nihao
nihao
[root@A ~]# awk 'END{print "nihao"}' a.txt 
nihao

awk 条件:
1.正则(模糊)

在一整行中包含root即可
[root@A ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#在一整行包含root即可(模糊查找)
[root@A ~]# awk -F: '/root/{print $3}' /etc/passwd
0
11
[root@A ~]# awk -F: '/^root/{print $3}' /etc/passwd
0
#在某一列中包含root即可(模糊查找) $1 为第一列
[root@A ~]# awk -F: '$1~/root/{print $3}' /etc/passwd
0
#$6 为第六列
[root@A ~]# awk -F: '$6~/root/{print $3}' /etc/passwd
0
11

2.数字和字符比较
== != > >= < <=
#打印UID大于1000的用户名(打印普通用户 系统用户的UID在(1-1000)之内)
[root@A ~]# awk -F: '$3>1000{print $1}' /etc/passwd
#打印用户名为root 的信息 
[root@A ~]# awk -F: '$1=="root"' /etc/passwd
root:x:0:0:root:/root:/bin/bash

3.逻辑&& ||

#UID大于10 并且小于20的用户信息
    [root@A ~]# awk -F: '$3>10&&$3<20' /etc/passwd
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

4.运算

[root@A ~]# awk 'BEGIN{x=3;y=4;print x+y}'
7
[root@A ~]# awk 'BEGIN{x=3;y=4;print x*y}'
12
[root@A ~]# awk 'BEGIN{print 3.5*2.2}'
7.7
[root@A ~]# awk 'BEGIN{x=3;print x*y}'  #y 不赋值默认为0
0
显示100以内7的倍数或者包含7的数
[root@A ~]# seq 100 | awk '$1%7==0||$1~/7/'

if指令
if(){}
if(){}else{}
if(){}else if(){}...

统计普通用户有多少,系统用户有多少
[root@B ~]# awk -F: '{if($3<1000){x++}else{y++}}END{print "系统用户:",x,"\t普通用户:",y}' /etc/passwd
系统用户: 41    普通用户: 2
[root@B ~]# awk -F: '$3>=1000' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
usetr:x:1000:1000:usetr:/home/usetr:/bin/bash

while指令
while(){}

[root@B ~]# cat a.txt 
root hehe root
xixi root
ni hao ma root
[root@B ~]# awk '{i=1;while(i<=NF){if($i=="root"){x++};i++}}END{print x}' a.txt
4

实验:awk统计http服务访问次数
虚拟机(http 服务端)

[root@A ~]# systemctl restart  httpd.service 
[root@A ~]# ll -h /var/log/httpd/access_log 
-rw-r--r--. 1 root root 2.7K 1128 03:11 /var/log/httpd/access_log
[root@A ~]# firewall-cmd --set-default-zone=trusted 
success
[root@A ~]# setenforce 0

模仿用户访问1000次
真实机 (客户端)

[root@room1pc32 桌面]# yum -y install httpd-tools
[root@room1pc32 桌面]# ab -c 100 -n 1000 http://172.25.0.100/

查看http用户访问日志
虚拟机 (http 服务端)

[root@A ~]# ll -h /var/log/httpd/access_log 
-rw-r--r--. 1 root root 95K 123 20:14 /var/log/httpd/access_log

模仿用户访问10000次
真实机 (客户端)

[root@room1pc32 桌面]# ab -c 100 -n 10000 http://172.25.0.100/

查看http用户访问日志
虚拟机 (http 服务端)

[root@A ~]# ll -h /var/log/httpd/access_log 
-rw-r--r--. 1 root root 1013K 123 20:16 /var/log/httpd/access_log

统计httpd_access每个人的统计次数

[root@A ~]# awk '{ip[$1]++} END{for (i in ip){print i, ip[i] }}' /var/log/httpd/access_log
::1 20
172.25.0.250 11000

练习脚本
1.一键部署nginx源码包,麻烦]
#!/bin/bash
#这是我自己写的yum判断
bash /root/yum.sh
echo -n '正在解压nginx...'
tar -xf nginx-1.8.0.tar.gz &>/dev/null 
cd nginx-1.8.0
echo -e "\e[32;1m[OK]\e[0m"
echo -n '正在安装依赖包...'
yum -y install gcc pcre-devel openssl-devel &>/dev/null
echo -e "\e[32;1m[OK]\e[0m"
echo -n './configure 配置...'
./configure &>/dev/null
echo -e "\e[32;1m[OK]\e[0m"
echo -n 'make编译...'
make &>/dev/null
echo -e "\e[32;1m[OK]\e[0m"
echo -n 'make install 安装...'
make install &>/dev/null
echo -e "\e[32;1m[OK]\e[0m"

a=`ls /usr/local/nginx/ | wc -l`
if [ $a -eq 0 ];then
    echo -n '安装失败'
    echo -e "\e[31;1m[Failed]\e[0m"
else    
    echo -n '安装成功'
    echo -e "\e[32;1m[OK]\e[0m"
fi

2.nginx启动服务的脚本
#!/bin/bash
case $1 in
start)
/usr/local/nginx/sbin/nginx;;
stop)
/usr/local/nginx/sbin/nginx -s stop;;
reastart)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
status)
netstat -ntulp | grep nginx &> /dev/null
if [ $? -eq 0 ];then
echo -e "Active: active \033[32m(running)\033[0m"
else
echo -e "Active: inactive \033[31m(dead)\033[0m"
fi;;
*)
echo Error;;
esac

4.检查/var/log/secure看看有没有人尝试破解密码
#!/bin/bash
while :
do
rm -rf ip.txt
#这里我使用的是访问失败12次就被标记
awk '/Failed/{print $11}' /var/log/secure | awk '{ip[$1]++} END{for(i in ip){if(ip[i]>=12){print i}}}' >> ip.txt
for i in cat ip.txt
do
#这里暂时将标记的ip放入block区中
firewall-cmd --zone=block --add-source=$i &> /dev/null
done
sleep 10
done

3.监控脚本(awk过滤):
#!/bin/bash
CPU=uptime | awk '{print$10}'
echo "当前CPU负载为:${CPU}"
#这里RX1和RX2是相等的RX1是为了方便计算,RX2是为了使用户查看方便
RX1=ifconfig eth0 | awk '/RX p/{print $5}'
RX2=ifconfig eth0 | awk -F\( '/RX p/{print $2}' | sed 's/[)]//'
echo "当前网卡接受的数据流量:$RX2"
#这里TX1和TX2是相等的RX1是为了方便计算,RX2是为了使用户查看方便
TX1=ifconfig eth0 | awk '/TX p/{print $5}'
TX2=ifconfig eth0 | awk -F\( '/TX p/{print $2}' | sed 's/[)]//'
echo "当前网卡接受的数据流量:$TX2"
FREE=free | awk '/Mem/{print $4}'
echo "当前内存剩余:$FREE"
ROOTFREE=df | awk '/\/$/{print $4}'
echo "当前根份区的剩余容量:$ROOTFREE"
USERS=cat /etc/passwd | wc -l
echo "当前计算机的账户数量:$USER"
USERNOW=who | awk 'END{print NR}'
echo "当前登陆了几个人:$USERNOW"
NUM=ps aux | wc -l
echo "当前开启的进程数量: $NUM"
SNUM=rpm -qa | wc -l
echo "已经安装了多少软件:$SNUM"










本文转自 Xuenqlve 51CTO博客,原文链接:http://blog.51cto.com/13558754/2057165,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
48 35
|
1天前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
25 10
|
2天前
|
运维 监控 安全
python在自动化运维中的妙用分享
python在自动化运维中的妙用分享
18 8
|
1天前
|
运维 Ubuntu Linux
掌握自动化运维:使用Ansible进行服务器配置管理
【9月更文挑战第5天】本文旨在通过深入浅出的方式,介绍如何利用Ansible这一强大的自动化工具来简化和加速日常的服务器配置管理工作。文章将首先概述自动化运维的重要性,接着详细讲解Ansible的基本概念、安装过程及其在服务器配置中的应用实例。我们将通过具体的操作步骤和代码示例,展示如何使用Ansible编写任务,以及如何执行这些任务以实现批量的服务器配置。最后,文章将探讨一些高级用法,帮助读者进一步提升自动化运维的能力。
|
2天前
|
运维 监控 Devops
自动化运维之路:从脚本到DevOps
【9月更文挑战第4天】本文通过探索自动化在运维中的应用,揭示从简单的shell脚本到复杂的DevOps实践的转变过程。我们将讨论如何利用自动化工具来提升效率、减少错误并优化工作流程,同时分享一些实用的代码示例,帮助读者理解自动化运维的实际应用场景。
20 5
|
2天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
3天前
|
存储 运维 应用服务中间件
自动化运维:提升效率的秘诀
【9月更文挑战第3天】本文旨在探讨如何通过自动化运维来提高工作效率和减少人为错误,从而确保系统的高可用性和可靠性。我们将深入讨论自动化运维的核心概念、实施步骤以及面临的挑战,并配以实际代码示例,帮助读者更好地理解和应用自动化运维技术。
17 6
|
2天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible在配置管理中的应用
【9月更文挑战第4天】在现代企业中,随着服务器数量的增加和业务的复杂性提高,传统的手动运维方式已经无法满足快速、高效、稳定的业务需求。自动化运维应运而生,成为提升工作效率、减少人为错误的关键技术。本文将介绍Ansible这一自动化运维工具,通过实例展示其在配置管理中的应用,帮助读者理解如何借助Ansible简化日常运维工作,实现服务器的批量管理与自动化部署。
20 4
|
2天前
|
运维 Prometheus 监控
自动化运维工具链的构建与实践
【9月更文挑战第4天】在现代IT运维管理中,自动化工具链的搭建是提升效率、保障稳定性的关键。本文将通过一个实际案例,展示如何从零开始构建一套高效的自动化运维体系,涵盖从监控、部署到故障处理的完整流程,并分享实践中的经验教训和成效分析。
17 4
|
2天前
|
机器学习/深度学习 人工智能 运维
自动化运维的演变之路:从脚本到智能
在数字化浪潮中,自动化运维如同一艘船,载着企业乘风破浪。本文将带你穿梭于自动化运维的历史长河,见证它如何从简单的脚本编写,发展成为今天集成了人工智能技术的智能运维平台。我们将探索这一变革背后的原因、影响以及面临的挑战,同时分享一些行业内的成功案例,为你的企业运维之旅提供启示和方向。
下一篇
DDNS