shell 5-6合集

sell 5

回顾

正则表达式
基本正则 ^ $  [abc]  [^]  .  *  /{n,m/}   /{n/}  /{n,/}  /(/)
扩展正则+   ?    {n,m}   a|b|c   ()    /b

sed 非交互式编辑文本

前置命令  |  sed 选项  (定址符)指令 
sed 选项  (定址符)指令   被处理的文档
选项 :  -n  -r  -i
指令: p   d   s

==============================
a行下添加 i行上添加 c替换整行


找到使用bash的用户,按照 用户名 –> 密码的方式显示

#!/bin/bash
n=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $n  将找到的使用bash的用户名交给for循环
do
        p=`grep $i: /etc/shadow`  将名字与shadow对比
        p1=${p#*:}   找到对应的行,掐头
        p2=${p1%%:*}   去尾,得到纯粹的密码
        echo "$i --> $p2"  输出最后结果
done

awk 精确搜索文档

用法:
awk 选项  (条件)指令  被处理的文档
前置指令 | awk 选项  (条件)指令 

awk '{print}' test   输出所有
awk '{print $2}' test   输出每行第2列
awk '/hello/{print $2}' test   找到有hello的行,输出他的第2列
awk的内置变量  $1  $2  $3.....   $0 所有列    NR行号   NF列号

awk默认分隔符为空格,可以使用-F修改分隔符
awk -F: '{print $1}' user   定义分隔符为冒号, 输出第一列
awk -F[:/] '{print $10}' user    定义分隔符为冒号或者斜线, 输出第10列

awk -F: '{print $1"的解释器是"$7}' user   输出特定列,常量+变量
ifconfig eth0 | awk '/RX p/{print "本机eth0的接收流量是"$5"字节"}'    获取网卡接收流量
ifconfig eth0 | awk '/TX p/{print "本机eth0的发送流量是"$5"字节"}'        获取网卡发送流量

df -h | awk '/vda1/{print "当前主机跟分区剩余空间是"$4}'             获取根分区剩余空间
awk '/Failed/{print "***者的ip是"$11}' /var/log/secure 

awk的工作时机

BEGIN任务   执行1次
逐行任务      执行N次
END任务       执行1次

BEGIN{ }{ }END{ }

awk 'BEGIN{指令} {指令} END{指令}'  文件

awk 'BEGIN{print "ABCD"}{print}END{print NR}' user 

tab键   /t  制表符

awk -F: 'BEGIN{print "User/tUid/tHome"}{print $1"/t"$3"/t"$6 }END{print "总计 "NR" 行"}' user

========================================

awk处理条件

1, 使用正则作为条件

awk -F: '/^root/{print $1}' user  找以root开头的行,输出第1列
awk -F: '/^root|^bin/{print $1}' user  找以root或者bin开头的行,输出第1列
awk -F: '/^(root|bin)/{print $1}' user  同上

awk -F: '$1~/root/{print $1}' user  找第一列包含root的行,并且输出第1列
awk -F: '$1!~/root/{print $1}' user 第一列不包含root

2, 数字与字符串做条件 == != > >= < <=

awk -F: 'NR==1{print}' user   输出第1行
awk -F: 'NR>2{print}' user    输出行号大于2的行
awk -F: 'NR>=2{print}' user    输出行号大于等于2的行
awk -F: '$1=="root"{print}' /etc/passwd 输出第1列是root的行
awk -F: '$1~/root/{print}' /etc/passwd 输出第1列包含root的行
awk -F: '$1~/oot/{print}' /etc/passwd 输出第1列包含oot的行
awk -F: '$3>1000{print}' /etc/passwd 输出第三列大于1000的行

3, 使用逻辑符号 && 并且 || 或者

awk 'NR>=2 && NR<=4{print}' user 输出2~4行
awk 'NR<=1 || NR>4{print}' user  输出第1行,或者大于4的行
awk -F: '$3>=1000 && $3<=1005' /etc/passwd  当任务只是print时可以省略{print}    

输出所有普通用户的家目录与解释器
    例如:   张三的家目录是XXX ,解释器是 XXX
awk -F: '$3>=1000 && $3<=1100{print $1"的家目录是"$6",解释器是"$7 }' /etc/passwd

4,运算

awk 'BEGIN{x++;print x}'    把x+1   然后输出x的值
awk 'BEGIN{x=8;print x+=2}'  定义变量x=8, 然后+2再输出结果
awk 'BEGIN{x=8;x--;print x}' x定义好,然后减1,输出
awk 'BEGIN{print 2+3}'   
awk 'BEGIN{print 2*3}'
awk 'BEGIN{print 2*3}'

shell 6

回顾

awk 精确搜索文档
-F 定义分隔符   print
$1  $2  $3 .... $0   NR  NF   ""
正则表达式   /  /     ~    !~
字符串与数字  ==  !=  >  >=  <  <=
逻辑符号   &&   ||
运算  x++   

=============================

在awk中使用if判断

单分支:
awk '{if(/bash$/){x++}}END{print x}' user  如果找到以bash结尾的行,就把x+1,最后输出x的值

awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd   如果第3列(UID)大于等于1000,则把x+1,,最后输出x的值

双分支:
awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}'  /etc/passwd  如果第3列(UID)大于等于1000,则把x+1,否则把y+1,最后输出x与y的值

awk数组,数组可以理解为能保存多个值的特殊变量

数组名[下标]=元素值
awk 'BEGIN{a[1]=100;a[2]=200;print a[2],a[1]}'

awk 'BEGIN{a["x"]=100;a["y"]=200;print a["y"],a["x"]}'

awk 'BEGIN{a["x"]="abc";a["y"]="xyz";print a["y"],a["x"]}'

在awk中使用数组+for循环实现遍历数组

awk 'BEGIN{a[1]=100;a[2]=200;a[3]=300;for(i in a){print i,a[i]}}'

awk '{a[$1]++}END{for(i in a){print a[i],i}}' abc

a[abc]=3
a[xyz]=2
a[zxc]=1

a[192.168.0.1]=3
a[172.10.10.10]=2
a[100.100.100.100]=1

使用awk统计网站访问量:

/var/log/httpd/access_log是httpd服务的访问日志

awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log   最终显示访问的次数与对应的ip地址

ab -c 1 -n 10000 http://172.25.0.11/  访问10000次

awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -nr  统计完之后再排序,访问量最大的在第一行

#!/bin/bash
n=`uptime |sed -n 's/.*://p'`
echo 主机平均负载是$n
ifconfig eth0 | awk '/RX p/{print "主机的eth0 网卡接收流量是"$5"字节"}'
ifconfig eth0 | awk '/TX p/{print "主机的eth0 网卡发送流量是"$5"字节"}'
free -h |awk '/^Mem/{print "主机剩余内存容量是"$4}'
df -h | awk '///$/{print "根分区剩余容量是"$4}'
awk 'END{print "当前主机用户总数是"NR}' /etc/passwd
w=`who | wc -l`
echo 当前登录的账户数量是$w个
p=`ps aux | wc -l`
echo 当前主机开启的进程数量是$p个
r=`rpm -qa | wc -l`
echo 当前主机安装的软件包数量是$r个

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/182838.html

(0)
上一篇 2021年11月1日
下一篇 2021年11月1日

相关推荐

发表回复

登录后才能评论