一、awk
分段去格式化输出文本的工具。
awk -F ':' '$3>500 {print $1,$3}' /etc/passwd#以:作为分隔符分隔段,每行的第三段的值大于500 就打印出第一段和第三段的值。
awk -F ':' '$3>“500” {print $1,$3}' /etc/passwd#加入引号的500就是字符串,会以字符串的方式进行处理
awk -F ':|#' '{print $2}' 1.txt#本例的分隔符可以是:也可以是#,截取指定段。
awk -F ':' '$1 ~ "abc"' 1.txt#过滤出第一段包含的abc的行,其中abc可以是一个正则表达式
awk -F ':' '$1 ~ "^ro+"' 1.txt#过滤出第一段包含以ro开头(如ro roo rooo...)的行
#多个语句同时使用
awk -F ':' '$1 ~ "root" {print $1,$3};$3>100 {print $1,$2}' 1.txt#两个条件的内容都被过滤出,并执行了相应的打印
#如果不指定分隔符,则以空白字符作为分隔符,在awk中可以用&&表示并且,用||表示或者。$0会输出整行
awk '$3<100 && $7 ~ "bash" {print $0}' 1.txt#多个条件
#内置变量
awk -F ':' '{print NF,NR}' 1.txt
#NF为段数,NR为行数
#数学运算
awk -F ':' '$7=$3+$4 {print $0}' 1.txt#因为$7的值被重新定义了,所以打印¥0时,并不会包含分隔符,等然也可以定义分隔符
awk -F ':' -v OFS='#' '$7=$3+$4 {print $0}' 1.txt#-v定义变量,OFS也是一个内置变量,它表示输出的结果的分隔符
#计算某一段的总和
awk -F ':' '{(tot=tot+$3)};END {print tot}' 1.txt
二、sort排序
语法:sort [-t 分隔符][-kn1,n2][-nru]
n1<n2
-t分隔符:作用跟cut的-d一个意思
-n 使用纯数字排序
-r:反向排序
-u:去重复
head -n5 /etc/passwd |sort#sort默认按照ASCII码升序输出
head -n5 /etc/passwd |sort -t: -k3 -n#以:分隔符的第三个区使用纯数字进行排序
head -n5 /etc/passwd |sort -t: -k3,5 -r#表示从第3到第5区域间的字符串排序,-r表示反向排序
三、uniq去重复
使用uniq之前需要先给文件排序,否则不管用
sort test.txt|uniq#去重输出
sort test.txt|uniq -c#输出去重后的的结果并显示重复行数
四、iptables工具
在CentOS系统中有一个叫做netfilter的防火墙,它可以对进入或者即将离开网卡的数据包进行处理。最常见的用法就是封IP,在CentOS7系统里服务名是firewalld
1、查看filter表的iptables规则
#iptables -nvL -t filter
在centOS7上的netfilter有5个表,分别是:filter、nat、mangle、raw、security。而我们用的比较多的是是前两个,该命令中的-t filter可以省略,默认用的是filter表。
2、增加规则
iptables -A INPUT -p tcp --dport 80 -s 1.1.1.1 -j DROP
-A表示增加规则,INPUT为filter表里的一个链,除此之外还有OUTPUT链和FORWARD链。
五、Linux系统状态
1、w命令查看当前系统的负载
第一行从左到右依次显示:时间、系统运行时间、登录用户数、平均负载。
第二行:当前登录用户名以及登录地址等。
load average:第一个值表示1分钟内系统的平均负载值;第二个值表示5分钟内系统的平均负载值;第三个值表示15分钟内系统的平均负载值。值越大表示服务器压力越大。一般情况下,这个值只要不超过服务器的cpu数量就没有关系。
cat /proc/cupinfo# 查看系统cpu数量
grep -c 'processor' /proc/cpuinfo#2*n(n表示内核数),如果一个cpu有四个内核,则数值显示是7
查看有几颗物理CPU时,则需要查看关键字physcal id。
2、vmstat命令监控系统的状态
- procs显示进程的相关信息
r(run):表示运行或等待CPU时间片的进程数。实际上某一时刻1个CPU只能有一个进程占用,其他进程只能排着队等着,如果该数值如果长期大于服务器cpu的个数,则说明cpu资源不够用了。
b(block):表示等待资源的进程数,这个资源指的是I/O、内存等。该数值如果长时间大于1,则需要关注下。
- memory显示内存的相关信息
swpd:表示切换到交换分区中的内存数量,单位为KB
free:表示当前空闲的内存数量,单位为KB
buff:表示(即将写入磁盘的)缓冲大小,单位为KB
cache:表示(从磁盘中读取的)缓存大小,单位为KB
- swap显示内存的交换情况
si:表示由交换区写入内存的数据量,单位为KB
so:表示由内存写入交换区的数据量,单位为KB
- io显示磁盘的使用情况
bi:表示从块设备读取数据的量(读磁盘),单位为KB
bo:表示从块设备写入数据的量(写磁盘),单位为KB
- system显示采集间隔内发生的中断次数
in:表示在某一时间间隔内观测到的每秒设备的中断次数。
cs:表示每秒产生的上下文切换次数。
- cpu显示CPU的使用状态
us:显示用户下所花费CPU的时间百分比
sy:显示系统花费CPU的时间百分比
id:表示CPU处于空闲状态的时间百分比
wa:表示I/O等待所占用CPU的时间百分比
st:表示被偷走的CPU所占百分比(一般为0,不用关注)
vmstat 1 5#每隔一秒输出一次状态,共输出5次
vmstat 1#每隔一秒输出一次状态,一直输出,CTRL+C终止
3、top显示进程所占的系统资源
top -bn1|head#一次性输出所有信息
top#每隔3秒变一次,q结束
4、sar命令监控系统状态
sar -n DEV#查看网卡流量
sar -n DEV -f /var/log/sa/sa03#查看某一天的网卡流量历史
sar -q#查看历史负载
5、nload查看网卡流量
yum install -y epel-release;yum install -y nload#非系统自带
6、free查看内存使用状况
free -m#(以MB为单位);-g以GB为单位
7、ps查看系统进程
ps aux|grep -c sshd
8、netstat查看网络状况
netstat -lnp
netstat -an |head -n 20#只显示前20行
六、shell脚本
自定义脚本可放在/usr/local/sbin目录,方便管理
#! /bin/bash表示该文件使用的是bash语法
#表示注释,不写也没问题,只是随着时间推移,害怕慢慢忘记所以最好有注释
1、date命令
date+%Y:表示以四位数字格式打印年份
date+%y:表示以两位数字格式打印年份
date+%m:表示月份
date+%d:表示日期
date+%H:表示小时
date+%M:表示分钟
date+%S:表示秒
date+%w:表示星期,结果显示0则表示周日
date +"%Y-%m-%d %H:%M:%S"#表示当前的日期
date -d "-1 day" +%d#表示一天前的日期
date -d "-1 hour" +%H#表示一小时前
date -d "-1 min" +%M#表示一分钟前
2、变量
使用到的反引号,表示把引号中的字符串当成shell命令执行,返回命令的执行结果
变量名=变量的值,使用变量时,需在变量名前加$
3、数学运算
#vim sum.sh
#! /bin/bash
a=1
b=2
sum=$[$a+$b]
echo "$a+$b=$sum"
sh sum.sh
4、和用户交互
#cat read.sh
#! /bin/bash
##Using 'read' in shell script
read -p "Please input a number:" x
read -p "Please input another number:" y
sum=$[$x+$y]
echo "The sum of the two number is: $sum"
5、shell脚本预设变量
echo "$1 $2 $0" #$0代表脚本本身
###结果是#####
1 2 option.sh
6、shell脚本中的逻辑判断
1)if...else...
#vim if3.sh
#! /bin/bash
read -p "Please input your score:" a
if ((a<60)); then
echo "You didn't pass the exam."
elif ((a>=60)) && ((a<85)); then
echo "Good! You pass the exam."
else
echo "Very good! Your score is ver high!"
fi
###&&表示并且,||表示或者
###判断数值大小除了可以使(())外,还可以使用[];当使用[]时,就不能使用>、<、=这样的符号了,需要使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于)。
注:(())中的变量是不加$的,[]中的变量是加$的
2)和文档相关的判断
-e:判断文件或目录是否存在
-d:判断是不是目录以及是否存在
-f:判断谁不是普通文件以及是否存在
-w:判断是否有写权限
-x:判断是否可执行
if [-d /home/]; then echo ok; fi
3)case
#vim case.sh
#! /bin/bash
read -p "Input a number: " n
a=$[$n%2]
case $a in
1)
echo "The number is odd."
;;
0)
echo "The number is even."
;;
*)
echo "It's not a number!"
;;
esac
7、shell脚本中的循环
1)for循环
###打印1到5的一个序列
#vim for.sh
#! /bin/bash
for i in `seq 1 5`;do
echo $i
done
#for file in `ls`; do echo $file; done
#打印当前文件夹中文件名
2)while循环
#cat while.sh
#! /bin/bash
a=5
while [$a -ge 1]; do
echo $a
a=$[$a-1]
done
#以下是死循环
while :; do
command
sleep 3
done
8、shell脚本中的函数
1)函数
#vim func.sh
#! /bin/bash
function sum()
{
sum=$[$1+$2]
echo $sum
}
#调用方式一:
sum $1 $2
#调用方式二:
sh func.sh 1 2
#结果是3
2)中断和继续
break表示退出一层循环;continue表示退出本次循环,并继续
exit表示退出整个shell脚本