第五周
第一天
数组
declare -a title=([0]="ceo" [1]="coo" [2]="cto")
echo ${title[1]}
coo
echo ${title}
ceo
echo ${title[2]}
cto
echo ${title[3]}
echo ${title[@]}
ceo coo cto
echo ${title[*]}
ceo coo cto
echo ${#title[*]} (数组长度)
3
echo ${title[*]}
ceo coo cto
unset title[1] (删除数组)
echo ${title[*]}
ceo cto
unset title
echo ${title[*]}
数据处理
[root@centos8 ~]#num=({0..10})
[root@centos8 ~]#echo ${num[*]:2:3} (跳过两个取三个)
2 3 4
[root@centos8 ~]#echo ${num[*]:6} (跳过6个)
6 7 8 9 10
[root@centos8 ~]#num[${#num[@]}]=11 (追加元素)
[root@centos8 ~]#echo ${#num[@]}
12
[root@centos8 ~]#echo ${num[@]}
0 1 2 3 4 5 6 7 8 9 10 11
关联数组
declare -A appay_name (必须实现声明才能使用)
name[ceo]=mage
name[cto]=wang
name[coo]=zhang
echo ${name[ceo]}
zhang
echo ${name[cto]}
zhang
echo ${name[coo]}
zhang
echo ${name}
zhang
declare -A name
-bash: declare: name: cannot convert indexed to associative array
unset name
declare -A name
name[ceo]=mage
name[cto]=wang
name[coo]=zhang
echo ${name[coo]}
zhang
echo ${name[ceo]}
mage
echo ${name[cto]}
wang
echo ${name[*]}
mage wang zhang
字符串处理
返回字符串变量var的长度
${#var}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部
分
${var:offset:number}
取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-
length前空格
${var: -length:-offset}
实例:
str=abcdef我你他
echo ${#str}
9
echo ${str:2}
cdef我你他
echo ${str:2:3}
cde
echo ${str:-3}
abcdef我你他
echo ${str: -3}
我你他
echo ${str:2:-3}
cdef
echo ${str: -2:-3}
-bash: -3: substring expression < 0
echo ${str: -3:-2}
我
echo ${str:-3:-2}
abcdef我你他
echo ${str: -3:-2}
我
echo ${str: -5:-2}
ef我
基于模式取子串
file="var/log/messages"
echo ${file#*/}
log/messages
echo ${file##*/} (贪婪模式,取至最后一个指定字符)
messages
查找替换
查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
${var/pattern/substr}
查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
${var//pattern/substr}
查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}
查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
${var/%pattern/substr}
把var中的所有小写字母转换为大写
${var^^}
把var中的所有大写字母转换为小写
${var,,}
查找删除
删除var表示的字符串中第一次被pattern匹配到的字符串
${var/pattern}
删除var表示的字符串中所有被pattern匹配到的字符串
${var//pattern}
删除var表示的字符串中所有以pattern为行首匹配到的字符串
${var/#pattern}
删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
${var/%pattern}
****************************************awk
基础用法一个例子搞定
文件内容datafile如下:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Suan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Saveage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
上面的数据表中包含名字、电话号码和过去三个月里的捐款,下面分别用awk解答:
1)显示所有电话号码?
awk -F ":" '{print $2}' datafile.txt
2)显示Dan的电话号码?
awk -F ":" '/^Dan/{print $2}' datafile.txt
3)显示Suan的捐款和电话?
awk -F ":" '/^Suan/{print $3,$4,$5,$2}' datafile.txt
4)显示所有以D开头的姓?
awk -F ":" '{print $1}' datafile.txt | awk '{print $2}'|awk '/^D/'
5)显示所有以一个C或E开头的名?
awk -F ":" '{print $1}' datafile.txt | awk '{print $1}'|awk '/^[CE]/'
6)显示所有只有四个字符的名?
awk -F ":" '{print $1}' datafile.txt | awk '{if(length($1)==4)print $1}'
7)显示所有区号为916的人名?
awk -F ":" '/916/{print $1}' datafile.txt
8)显示Mike的捐款,显示每个值时都有$开头,如$250$100$175?
awk -F ":" '/^Mike/{print "$"$3"$"$4"$"$5}' datafile.txt
9)显示姓,其后跟一个逗号和名,如Jody,Savage?
awk -F ":" '{print $1}' datafile.txt | awk '{print $2,",",$1}'
10)写一个awk的脚本,作用:
(1)显示Savage的全名和电话号码
(2)显示Cher的捐款
(3)显示所有头一个月捐款$250的人名
vim awk
#!/bin/awk -f
BEGIN{FS=":"}
{if($1 ~/Savage/) print $1":"$2}
{if($1~/^Chet/) print "$"$3":""$"$4":""$"$5}
{if($3==250) print $1}
awk -f awk datafile.txt
11)显示字段数量
awk -F: '{print NF}' datafile.txt
12)取出倒数第二个字段
awk -F: '{print $(NF-1)}' datafile.txt
第二天
awk高级用法
条件判断if-else
使用场景:对awk取得的某行或某个字段做条件判断
awk -F: '{if($3>=1000)print $1,$3}' /etc/passed
awk -F: '{if($NF=="/bin/bash")print $1}' /etc/passwd
awk '{if(NF>5)print $0}' /etc/passwd
awk -F: '{if($3>=1000) print "common user: %s\n,$1"} else {print "root or sysuser: %s\n",$1}' /etc/passwd
df -h | awk -F% '\/dev\/sd/{print $1}' | awk '$NF>=80{print $1,$5}'
awk 'BEGIN{ test=100;if(test>90){print "very good"}
else if (test>60){print "good"}else{print "no pass"}}'
循环while
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grubs.cfg
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
awk '/^[[:space:]]*linux16/{i=1;whlie(i<=NF){if(length($i)>=10){print $i,length($i);i++}}' /etc/passwd
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
awk 'BEGIN{ total=0;while(i<=100){total+=i;i++};print total}'
5050
do-while循环
意义:无论真假,至少执行一次循环体
do-while循环
语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体
awk 'BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print total}'
5050
循环for
语法:
for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iteration process) {for-bady}
特殊用法:能够遍历数组中的元素
for(var in array) {for-bady}
awk 'BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}'
5050
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
性能比较
time (awk 'BEGIN{total=0;for(i=0;i<=10000;i++){total+=i};print total;}')
time (total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)
time (for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)
time (seq -s "+" 10000| bc)
continue和break
awk 'BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0)continue;sum+=i}print sum}'
2500
awk 'BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==50)break;sum+=i}print sum}'
1225
next
next可以提前结束对本行处理而直接进入下一行的处理(awk自生身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
nobody 65534
polkitd 998
gluster 996
rtkit 172
rpc 32
chrony 994
saslauth 992
clevis 984
pegasus 66
colord 982
setroubleshoot 980
gdm 42
gnome-initial-setup 978
sshd 74
avahi 70
tcpdump 72
wang 1000
数组
awk的数组为关联数组
格式:
array[index-expression]
例:
weekdays["mon"]="Monday"
index-expression
可使用任意字符串;字符串要使用双引号括起来
如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday
#判断数组索引是否存在
awk 'BEGIN{array["i"]="x";array["j"]="y";print "i" in array,"y" in array}'
1 0
awk 'BEGIN{array["i"]="x";array["j"]="y";if("i" in array) {print "存在"}else{print "不存在"}}'
存在
awk 'BEGIN{array["i"]="x";array["j"]="y";if ("abc" in array) {print "存在"}else{print"不存在"}}'
不存在
#遍历数组中的每个元素,要使用for循环
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print weekdays[i]}}'
Tuesday
Monday
自定义函数
cat func.awk
function max(x,y) {
x>y?var=x:var=y
return var
}
BEGIN{print max(a,b)}
awk -v a=30 -v b=20 -f func.wak
30
awk脚本
cat test2.awk
#!/bin/awk -f
{if($3>=min && $3<=max)print $1,$3}
chmod +x test2.awk
./test2.awk -F: min=100 max=200 /etc/passwd
systemd-resolve 193
rtkit 172
pulse 171
qemu 107
usbmuxd 113
abrt 173
网络管理和协议
OSI 模型的七层结构
第7层 应用层
应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:
HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等
第6层 表示层
主条目:表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式
第5层 会话层
会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。
第4层 传输层
传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议
等发送信息。例如:传输控制协议(TCP)等。
第3层 网络层
网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。
网络表头包含了网络数据。例如:互联网协议(IP)等。
第2层 数据链接层
数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形
成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链
表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务
(GPRS)等。分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制
(Media access control,MAC)子层
第1层 物理层
物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网
络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等
三种通讯模式
单播,广播,组播
冲突域和广播域
冲突域:两个网络设备同时发送数据,如果发生了冲突,则两个设备处于同一个冲突域,反之,则各自处于不同的冲突域
广播域:一个网络设备发送广播,另一个设备收到了,则两个设备处于同一个广播域,反之,则各自处于不同的广播域
三种通讯模式
单工通信:只有一个方向的通信
半双工通信:通信双方都可以发送和接受信息,但不能同时发送,也不能同时接受
全双工通信:通信的双方可以同时发送和同时接受
第三天
1 TCP 三次握手,四次挥手,内核参数优化
2 TCP 包头格式了解
3 IP 头格式了解
4 IP 计算公式,划分子网,超网
5 centos6之前版本网卡名称修改
内核参数优化
编辑文件/etc/stsctl.conf,加入以下内容:然后执行sysctl -p让参数生效
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_orphans = 16384
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
作用说明
net.ipv4.tcp_fin_timeout 表示套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认值是60秒。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_tw_reuse 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认值为0,表示关闭。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_tw_recycle 表示开启TCP连接中TIME-WAIT sockets的快速回收。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0,表示关闭。 提示:reuse和recycle这两个参数是为防止生产环境下Web、Squid等业务服务器time_wait网络状态数量过多设置的。
net.ipv4.tcp_syncookies 表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,这个参数也可以不添加。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies,默认值为1
net.ipv4.tcp_keepalive_time 表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,建议改为10分钟。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒。
net.ipv4.ip_local_port_range 该选项用来设定允许系统打开的端口范围,即用于向外连接的端口范围。 该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
net.ipv4.tcp_max_syn_backlog 表示SYN队列的长度,即半连接队列长度,默认为1024,建议加大队列的长度为8192或更多,这样可以容纳更多等待连接的网络连接数。 该参数为服务器端用于记录那些尚未收到客户端确认信息的连接请求最大值。 该参数对象系统路径
为:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值,TIME_WAIT套接字将立刻被清除并打印警告信息。 默认为180000,对于Apache、Nginx等服务器来说可以将其调低一点,如改为5000~30000,不通业务的服务器也可以给大一点,比如LVS、Squid。 此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_bucket
net.ipv4.tcp_synack_retries 参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries,默认值为5
net.ipv4.tcp_syn_retries 表示在内核放弃建立连接之前发送SYN包的数量。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries,默认值为6
net.ipv4.tcp_max_orphans 用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。 如果超过这个数值,孤立连接将被立即被复位并打印出警告信息。 这个限制只有为了防止简单的DoS攻击。不能过分依靠这个限制甚至认为减少这个值,更多的情况是增加这个值。该参数对应系统路为:/proc/sys/net/ipv4/tcp_max_orphans ,默认值8192
net.core.somaxconn 同时发起的TCP的最大连接数,即全连接队列长度,在高并发请求中,可能会导致链接超时或重传,一般结合并发请求数来调大此值。 该参数对应系统路径为:/proc/sys/net/core/somaxconn ,默认值是128
net.core.netdev_max_backlog 表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数。 该参数对应系统路径
为:/proc/sys/net/core/netdev_max_backlog,默认值为1000
子网掩码的八位
1000 0000=128
1100 0000=192
1110 0000=224
1111 0000=240
1111 1000=248
1111 1100=252
1111 1110=254
1111 1111=255
相关公式
一个网络的最多的主机数=2^主机ID位数-2
网络(段)数=2^网路ID可变的位数
网络ID=IP与netmask
判断对方主机是否在同一个网段:
用自己的子网掩码分别和自己的IP及对方的IP相与,比较结果,相同则来自同一个网段,不同则来自不同的网段
netmask: 255.255.224.0,网络ID位:19 主机ID位:13,主机数=2^13-2=8190
#判断A和B是否在同一个网段
A:192.168.1.100 netmask:255.255.255.0
B:192.168.2.100 netmask:255.255.0.0
A主机在同一个网段,B主机不在同一个网段
172.16.1.100/28
#主机数?
2^4-2
#网络ID?
172.16.1.96
#主机最小的IP:
172.16.1.97
#最大的IP?
172.16.1.110
来源:CSDN
作者:KanoeYuko
链接:https://blog.csdn.net/kanoeYuko/article/details/103878591