[关闭]
@mrz1 2018-01-04T09:03:46.000000Z 字数 14196 阅读 771

2017-12-29课程笔记(主要AWK 管理systemd)

笔记


printf命令

  1. 格式化输出:printf "FORMAT", item1, item2, ...
  2. (1) 必须指定FORMAT
  3. (2) 不会自动换行,需要显式给出换行控制符,\n
  4. (3) FORMAT中需要分别为后面每个item指定格式符
  5. 格式符:与item一一对应
  6. %c: 显示字符的ASCII
  7. %d, %i: 显示十进制整数
  8. %e, %E:显示科学计数法数值(10的几次方)
  9. %f:显示为浮点数
  10. %g, %G:以科学计数法或浮点形式显示数值
  11. %s:显示字符串
  12. %u:无符号整数
  13. %%: 显示%自身
  14. 修饰符:
  15. #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
  16. -: 左对齐(默认右对齐)%-15s
  17. +:显示数值的正负符号%+d

printf示例

  1. awk -F: '{printf "%s",$1}' /etc/passwd //不换行显示user
  2. awk -F: '{printf "%s\n",$1}' /etc/passwd //换行显示user
  3. [root@centos7 ~]#awk -F: '{printf "Username:%s\n",$1}' /etc/passwd
  4. Username:root
  5. Username:bin
  6. Username:daemon
  7. [root@centos7 ~]#awk -F: '{printf "username:%s|uid:%d\n",$1,$3}' /etc/passwd
  8. username:root|uid:0
  9. username:bin|uid:1
  10. username:daemon|uid:2
  11. [root@centos7 ~]#awk -F: '{printf "%-30s|%10d\n",$1,$3}' /etc/passwd //正数右对齐负数左对齐
  12. root |0
  13. bin |1
  14. daemon |2
  15. [root@centos7 ~]#awk -v n=123.456789 'BEGIN{printf "%9.4f",n}'
  16. 123.4568 //有一个空格
  17. n9位数1-9;保留四位123.4568(约等于)宽度九位 所以前面是一个空格
  18. [root@centos7 ~]#awk -v n=123.456789 'BEGIN{printf "%9.5f",n}'
  19. 123.45679 //没有空格
  20. n9位数1-9;保留五位123.45679(约等于)宽度九位 所以前面没有空格
  21. [root@centos7 ~]#awk -v n=123.456789 'BEGIN{printf "%9.2f",n}'
  22. 123.46 //有三个个空格
  23. n9位数1-9;保留二位123.46(约等于)宽度九位 所以前面是三个空格

操作符

算术操作符

  1. 算术操作符
  2. x+y, x-y, x*y, x/y, x^y, x%y
  3. -x: 转换为负数
  4. +x: 转换为数值
  5. 字符串操作符:没有符号的操作符,字符串连接
  6. 赋值操作符:
  7. =, +=, -=, *=, /=, %=, ^=
  8. ++, --
  9. 下面两语句有何不同
  10. [root@centos7 ~]#awk 'BEGIN{i=0;print ++i,i}'
  11. 1 1
  12. [root@centos7 ~]#awk 'BEGIN{i=0;print i++,i}'
  13. 0 1
  14. 实例:
  15. [root@centos7 ~]#awk -v m=10 -v n=2 'BEGIN{printf m/n}'
  16. 5
  17. [root@centos7 ~]#awk -v m=10 -v n=2 'BEGIN{printf m-n}'
  18. 8
  19. [root@centos7 ~]#awk -v m=10 -v n=2 'BEGIN{printf m^n}'
  20. 100
  21. [root@centos7 ~]#awk -v m=10 -v n=3 'BEGIN{printf m%n}' 取模
  22. 1
  23. [root@centos7 ~]#awk -v m=10 -v n=3 'BEGIN{printf m*=n}'
  24. 30

比较操作符

  1. 比较操作符:
  2. ==, !=, >, >=, <, <=
  3. 模式匹配符:
  4. ~:左边是否和右边匹配包含
  5. !~:是否不匹配
  6. 示例:
  7. awk -F: '$0 ~ /root/{print $1}' /etc/passwd //查看包含root的行
  8. [root@centos7 ~]#awk '$0~"^bin" {print $1}' /etc/passwd
  9. bin:x:1:1:bin:/bin:/sbin/nologin
  10. [root@centos7 ~]#awk '$0~"^root"' /etc/passwd
  11. root:x:0:0:root:/root:/bin/bash
  12. [root@centos7 ~]#awk '$0~"^bin"' /etc/passwd
  13. bin:x:1:1:bin:/bin:/sbin/nologin
  14. [root@centos7 ~]#awk '$0 ~ /^(root|bin)/' /etc/passwd
  15. root:x:0:0:root:/root:/bin/bash
  16. bin:x:1:1:bin:/bin:/sbin/nologin
  17. awk '$0 !~ /root/' /etc/passwd //不包含root
  18. [root@centos7 ~]#awk -F: '$3==0' /etc/passwd
  19. root:x:0:0:root:/root:/bin/bash
  20. [root@centos7 ~]#awk -F: '$3>=1000' /etc/passwd
  21. nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
  22. fei:x:1000:1000:fei:/home/fei:/bin/bash
  23. lili:x:1001:1001::/home/lili:/bin/bash
  24. ""或者// 里面的表示正则
  25. [root@centos7 ~]#awk -F: 'i' /etc/issue
  26. [root@centos7 ~]#awk -F: -v i=0 'i' /etc/issue
  27. [root@centos7 ~]#awk -F: -v i="" 'i' /etc/issue
  28. [root@centos7 ~]#awk -F: -v i=" " 'i' /etc/issue
  29. The hostname is \n
  30. time is \t
  31. tty is \l
  32. \S
  33. Kernel \r on an \m
  34. 注意:i只要有值就打印(0"" 未定义不包括在内)

逻辑操作符

  1. 逻辑操作符:与&&,或||,非!
  2. 示例:
  3. awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
  4. [root@centos7 ~]#awk -F: '$3>=0 && $3<=1 {print $1}' /etc/passwd
  5. root
  6. bin
  7. awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
  8. [root@centos7 ~]#awk -F: '$3==0 || $3<=2 {print $1}' /etc/passwd
  9. root
  10. bin
  11. daemon
  12. awk -F: '!($3==0){print $1}' /etc/passwd
  13. [root@centos7 ~]#awk -F: '!($3!=0){print $0}' /etc/passwd
  14. root:x:0:0:root:/root:/bin/bash
  15. awk -F: '!($3>=500) {print $3}' /etc/passwd //找出userUID小于500的uid
  16. 打印末尾是/bin/bash
  17. [root@centos7 ~]#awk -F: '$NF == "/bin/bash" {print $0}' /etc/passwd
  18. root:x:0:0:root:/root:/bin/bash
  19. fei:x:1000:1000:fei:/home/fei:/bin/bash
  20. [root@centos7 ~]#awk -F: '$0 ~ "/bin/bash" {print $0}' /etc/passwd
  21. root:x:0:0:root:/root:/bin/bash
  22. fei:x:1000:1000:fei:/home/fei:/bin/bash
  23. [root@centos7 ~]#awk 'BEGIN{i=0;print !i++,i}'
  24. 1 1
  25. [root@centos7 ~]#awk 'BEGIN{i=0;print !(i++),i}'
  26. 1 1
  27. [root@centos7 ~]#awk 'BEGIN{i=2;print !i++,i}'
  28. 0 3
  29. [root@centos7 ~]#awk 'BEGIN{i=-1;print !++i,i}'
  30. 1 0
  31. [root@centos7 ~]#awk 'BEGIN{i=0;print !++i,i}'
  32. 0 1
  33. 注意 ()不起作用
  34. 函数调用:function_name(argu1, argu2, ...)
  35. 条件表达式(三目表达式):
  36. selector?if-true-expression:if-false-expression
  37. 示例:
  38. [root@centos7 ~]#awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%-20s|%-s\n",$1,usertype}' /etc/passwd
  39. root |SysUser
  40. bin |SysUser
  41. daemon |SysUser
  42. [root@centos7 ~]#awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%-20stype:%s\n",$1,usertype}' /etc/passwd
  43. root type:SysUser
  44. bin type:SysUser
  45. daemon type:SysUser
  46. adm type:SysUser

awk PATTERN

  1. PATTERN:根据pattern条件,过滤匹配的行,再做处理
  2. (1) 如果未指定:空模式,匹配每一行
  3. (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
  4. awk '/^UUID/{print $1}' /etc/fstab //打印UUID的那几行
  5. awk'!/^UUID/{print $1}' /etc/fstab //不打印UUID的那几行
  6. awk '/^#/' /etc/profile //打印以#开头的
  7. awk '!/^#/' /etc/profile //不打印以#开头的
  8. (3) relational expression: 关系表达式,结果为"真"才会被处理
  9. 真:结果为非0值,非空字符串
  10. 假:结果为空字符串或0
  11. 示例:
  12. awk -F: 'i=1;j=1{print i,j}' /etc/passwd //每一行后加 1 1
  13. awk '!0' /etc/passwd 取反为真,打印
  14. awk '!1' /etc/passwd 取反为假,不打印
  15. awk -F: '$3>=1000{print $1,$3}' /etc/passwd uid大于1000的打印
  16. awk -F: '$3<1000{print $1,$3}' /etc/passwd uid小于1000的打印
  17. awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd 打印结尾为/bin/bash
  18. awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd 打印结尾为bash
  19. seq 10 | awk 'i=!i' 打印奇数行seq 10 |sed -n ''1~2p
  20. seq 10 | awk -v i=1 'i=!i' 打印偶数行seq 10 |sed -n ''2~2p
  21. seq 10|awk '!(i=!i)' 打印偶数行
  22. [root@centos7 ~]#awk 'i=!i {print NR,$0}' /etc/passwd
  23. 1 root:x:0:0:root:/root:/bin/bash
  24. 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  25. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  26. (4) line ranges:行范围
  27. startline,endline:/pat1/,/pat2/不支持直接给出数字格式
  28. awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd //root到nobody直接的 包括nobody
  29. awk -F: '(NR>=1&&NR<=3){print NR,$1}' /etc/passwd //1-3行
  30. seq 10 |sed -n '2,4p'
  31. (5) BEGIN/END模式
  32. BEGIN{}: 仅在开始处理文件中的文本之前执行一次
  33. END{}:仅在文本处理完成之后执行一次
  1. awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd //开头打印BEGIN结尾打印END
  2. awk -F : '{print "USER USERID";print $1":"$3} END{print "end file"}' /etc/passwd //打印USER USERID再打印$1":"$3
  3. awk -F: 'BEGIN{print " USER UID \n---------------"}{print $1,$3}' /etc/passwd
  4. awk -F: 'BEGIN{print " USER UID \n---------------"}{print $1,$3} END{print "=============="}' /etc/passwd
  5. seq 10 |awk 'i=0' 不打印
  6. seq 10 |awk 'i=1' 打印1-10
  7. seq 10 | awk 'i=!i' 打印奇数
  8. seq 10 | awk '{i=!i;print i}' 1 0 1 0
  9. seq 10 | awk '!(i=!i)' 打印偶数
  10. seq 10 |awk -v i=1 'i=!i' 打印偶数

实例:BEGIN

BEGIN

awkaction

常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements
(5) output statements:print等

awk控制语句

  1. { statements;... } 组合语句
  2. if(condition) {statements;...}
  3. if(condition) {statements;...} else {statements;...}
  4. while(conditon) {statments;...}
  5. do {statements;...} while(condition)
  6. for(expr1;expr2;expr3) {statements;...}
  7. break
  8. continue
  9. delete array[index]
  10. delete array
  11. exit

awk控制语句if-else

  1. 语法:if(condition){statement;...}[else statement]
  2. if(condition1){statement1}else if(condition2){statement2}else{statement3}
  3. 使用场景:对awk取得的整行或某个字段做条件判断
  4. 示例:
  5. awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
  6. awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
  7. awk '{if(NF>5) print $0}' /etc/fstab
  8. awk -F: '{if($3>=1000) {printf"Common user: %s\n",$1}
  9. else {printf"root or Sysuser: %s\n",$1}}' /etc/passwd
  10. awk -F: '{if($3>=1000) printf "Common user: %s\n",$1;else printf "root or Sysuser: %s\n",$1}' /etc/passwd
  11. df -h|awk -F% '/^\/dev/{print $1}'|awk '$NF>=80{print $1,$5}'
  12. df | awk '{if($0 ~ /\/dev\/sd/) print $1,$5}'
  13. awk'BEGIN{ test=100;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'

awk

awk

awk控制语句 while循环 do-while

  1. 语法:while(condition){statement;...}
  2. 条件“真”,进入循环;条件“假”,退出循环
  3. 使用场景:
  4. 对一行内的多个字段逐一类似处理时使用
  5. 对数组中的各元素逐一处理时使用
  6. 示例:
  7. [root@centos7 ~]#awk -F: '{print $1,length($1)}' /etc/passwd
  8. root 4
  9. bin 3
  10. [root@centos7 ~]#awk -F: '/^root/{i=1;while(i<NF){print $i,length($i);i++}}' /etc/passwd
  11. root 4
  12. x 1
  13. 0 1
  14. 0 1
  15. root 4
  16. /root 5
  17. awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
  18. awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print $i,length($i)}; i++}}' /etc/grub2.cfg
  19. do-while循环
  20. 语法:do {statement;...}while(condition)
  21. 意义:无论真假,至少执行一次循环体
  22. 示例:
  23. [root@centos7 ~]#awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'
  24. 5050
  25. [root@centos7 ~]#awk -F: 'BEGIN{sum=0;for(i=1;i<=100;i++)sum+=i;print sum}'
  26. 5050

awk控制语句 for循环

  1. 语法:for(expr1;expr2;expr3) {statement;...}
  2. 常见用法:
  3. for(variable assignment;condition;iterationprocess) {for-body}
  4. 特殊用法:能够遍历数组中的元素
  5. 语法:for(varin array) {for-body}
  6. 示例:awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg

比较性能

  1. [root@centos7 ~]#time for((sum=0,i=1;i<=1000000;i++));do let sum+=i;done;echo $sum
  2. real 0m5.898s
  3. user 0m5.894s
  4. sys 0m0.000s
  5. 500000500000
  6. [root@centos7 ~]#time awk -F: 'BEGIN{sum=0;for(i=1;i<=1000000;i++)sum+=i;print sum}'
  7. 500000500000
  8. real 0m0.100s
  9. user 0m0.099s
  10. sys 0m0.001s
  11. [root@centos7 ~]#time seq -s+ 1000000 |bc
  12. 500000500000
  13. real 0m0.381s
  14. user 0m0.374s
  15. sys 0m0.012s
  16. [root@centos7 ~]#time awk 'BEGIN{i=1;sum=0;while(i<=1000000){sum+=i;i++};print sum}'
  17. 500000500000
  18. real 0m0.085s
  19. user 0m0.084s
  20. sys 0m0.001s

awk 性能最好

awk控制语句 switch语句

  1. 语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}
  2. breakcontinue
  3. awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}' //偶数相加
  4. awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}' //1加到66
  5. break [n]
  6. continue [n]
  7. next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
  8. awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd //偶数的uid
  9. awk -F: '{if($3%2!=1) next; print $1,$3}' /etc/passwd //奇数的uid

awk数组

  1. 关联数组:array[index-expression]
  2. index-expression:
  3. (1) 可使用任意字符串;字符串要使用双引号括起来
  4. (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
  5. 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
  6. 示例:
  7. weekdays["mon"]="Monday"
  8. awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
  9. awk '!arr[$0]++' dupfile
  10. 详细过程
  11. awk '{!arr[$0]++;print $0, arr[$0]}' dupfile
  12. [root@centos7 ~]#cat f1
  13. aa
  14. bb
  15. cccc
  16. ddd
  17. aa
  18. ddd
  19. cccc
  20. [root@centos7 ~]#awk 'arr[$0]++' f1 //重复行
  21. aa
  22. ddd
  23. cccc
  24. [root@centos7 ~]#awk '!arr[$0]++' f1 //不重复行(去重)
  25. aa
  26. bb
  27. cccc
  28. ddd
  1. 若要遍历数组中的每个元素,要使用for循环
  2. for(var in array) {for-body}
  3. 注意:var会遍历array的每个索引
  4. 示例:
  5. awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
  6. netstat -tan |awk '/^tcp/{ary[$NF]++}END{for(i in ary){print i,ary[i]}}'
  7. awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
  8. ss -nt |awk -F "[ :]" '/ESTAB/{ip[$(NF-2)]++}END{for(i in ip){
  9. print i,ip[i]}'
  10. ss -nt |awk -F "[ :]+" '/ESTAB/{ip[$(NF-2)]++}END{for(i in ip){
  11. print i,ip[i]}}'
  12. ss -nt |awk -F "[ :]+" '/ESTAB/{print $(NF-2)}'|sort|uniq -c |sort -nr|head -n10
  13. ss -nt |awk -F "[ :]+" '/ESTAB/{print $(NF-2)}'|sort|uniq -c |sort -nr|head -n10|while read count ip;do iptables -A INPUT -s $ip -j REJECT;done

awk函数

  1. 数值处理:
  2. rand():返回01之间一个随机数
  3. awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
  4. 字符串处理:
  5. length([s]):返回指定字符串的长度
  6. sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
  7. echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
  8. 2008-08:08 08:08:08
  9. gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
  10. echo "2008:08:08 08:08:08" | awk 'gsub(/:/,“-",$0)'
  11. 2008-08-08 08-08-08
  12. split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,...
  13. netstat -tn | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}' 外部连接ip

实例

  1. [root@centos7]#awk 'BEGIN{v="我" ;print length(v)}'
  2. 1
  3. [root@centos7]#awk 'BEGIN{srand();print rand()}' //随机数
  4. 0.704931
  5. [root@centos7 wang]#awk 'BEGIN{srand();print int(rand()*100)}' //取整数
  6. 52
  7. awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'//生成10个随机整数
  8. [root@centos7]# echo "11:22:33 44:55:66" | awk '{split($0,str,":")}END{for(i in str){print i,str[i]}}'
  9. 4 55
  10. 5 66
  11. 1 11
  12. 2 22
  13. 3 33 44
  14. 统计文件中单词的个数
  15. awk '{for(i=1;i<=NF;i++)word[$i]++}END{for(i in word)print word[i],i}' /etc/profile|sort -nr
求平均数
  1. [root@centos7 ~]#cat f1
  2. aa 100 male
  3. bb 20 male
  4. cc 50 female
  5. dd 60 female
  6. ee 99 xxx
  7. rr 150 ***
  8. [root@centos7 ~]#awk '{if($3=="male"){mnum++;msum+=$2}else{fnum++;fsum+=$2}}END{printf "male:%d %.2f\nfemale:%d %.2f",mnum,msum/mnum,fnum,fsum/fnum}' f1 //写死了
  9. male:2 60.00
  10. female:4 89.75
  11. [root@centos7 ~]#awk '{num[$3]++;sum[$3]+=$2}END{for(sex in num){print sex,sum[sex],sum[sex]/num[sex]}}' f1 //灵活
  12. female 110 55
  13. male 120 60
  14. *** 150 150
  15. xxx 99 99

自定义函数

  1. 格式:
  2. function name ( parameter, parameter, ... ) {
  3. statements
  4. return expression
  5. }
  6. 示例:
  7. (1)
  8. [root@centos7 ~]cat f1.txt
  9. function max(v1,v2) {
  10. v1>v2?var=v1:var=v2
  11. return var
  12. }
  13. BEGIN{a=3;b=2;print max(a,b)}
  14. [root@centos7 ~]#awk -f f1
  15. 3
  16. (2)
  17. [root@centos7 ~]cat f1.txt
  18. function max(v1,v2) {
  19. v1>v2?var=v1:var=v2
  20. return var
  21. }
  22. BEGIN{print max(a,b)}
  23. [root@centos7 ~]#awk -v a=3 -v b=2 -f f1.txt
  24. 3
  25. (3)
  26. [root@centos7 ~]cat f1.awk
  27. #! /bin/awk -f
  28. function max(v1,v2) {
  29. v1>v2?var=v1:var=v2
  30. return var
  31. }
  32. BEGIN{print max(a,b)}
  33. [root@centos7 ~]#./f1.awk -v a=3 -v b=2 -f
  34. 3

awk中调用shell命令

system命令
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来。

  1. [root@centos7 ~]#awk 'BEGIN{score=100; system("echo your score is " score) }' //打印变量 前面加空格 还有就是写到外面
  2. your score is 100
  3. [root@centos7 ~]#awk BEGIN'{system("hostname") }'
  4. centos7.qifei.com
  5. [root@centos7 ~]#ss -nt |awk -F "[ :]+" '/^ESTAB/{IP[$(NF-2)]++}END{for(i in IP){if(IP[i] >3)system("iptables -A INPUT -s "i" -j REJECT")}}' //连接数大于3加入防火墙
  6. iptables -vnL //查看禁用

awk脚本

将awk程序写成脚本,直接调用或执行
示例:

  1. [root@centos7 ~]#cat f1.awk
  2. {if($3>=1000)print $1,$3}
  3. [root@centos7 ~]#awk -F: -f f1.awk /etc/passwd
  4. -----------------------
  5. [root@centos7 ~]#cat f2.awk
  6. #!/bin/awk –f
  7. #this is a awkscript
  8. {if($3>=1000)print $1,$3}
  9. [root@centos7 ~]#chmod +x f2.awk
  10. [root@centos7 ~]#f2.awk F: /etc/passwd

向awk脚本传递参数

格式:
awkfile var=value var2=value2... Inputfile
注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数
示例:

  1. [root@centos7 ~]#cat test.awk
  2. #!/bin/awk –f
  3. {if($3 >=min && $3<=max)print $1,$3}
  4. [root@centos7 ~]#chmod +x test.awk
  5. [root@centos7 ~]#test.awk -F: min=100 max=200 /etc/passwd
  6. ---------------------
  7. [root@centos7 ~]cat f1.awk
  8. #! /bin/awk -f
  9. function max(v1,v2) {
  10. v1>v2?var=v1:var=v2
  11. return var
  12. }
  13. BEGIN{print max(a,b)}
  14. [root@centos7 ~]#./f1.awk -v a=3 -v b=2 -f
  15. 3

awk练习

  1. 统计/etc/fstab文件中每个文件系统类型出现的次数
  2. 统计/etc/fstab文件中每个单词出现的次数
  3. 提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
  4. 解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT
  1. [root@centos7 ~]#ss -nt |awk -F "[ :]+" '/^ESTAB/{IP[$(NF-2)]++}END{for(i in IP){if(IP[i] >3)system("iptables -A INPUT -s "i" -j REJECT")}}' //连接数大于3加入防火墙
  2. iptables -vnL //查看禁用

管理systemd

systemd

  1. POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs--> /sbin/init
  2. init:
  3. CentOS 5: SysVinit
  4. CentOS 6: Upstart
  5. CentOS 7: Systemd
  6. Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
  7. Systemd新特性:
  8. 系统引导时实现服务并行启动
  9. 按需启动守护进程(需要那个启动那个)
  10. 自动化的服务依赖关系管理(如果a依赖b会自动加载;与centos6相反)
  11. 同时采用socket式与D-Bus(桌面)总线式激活服务(ip地址加端口号 ss -ntl
  12. 系统状态快照
  13. 核心概念:unit
  14. unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
  15. 配置文件:
  16. /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/(大概与centos6 /etc/init.d/)
  17. /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
  18. /etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
  19. systemctl status httpd.service

Unit类型

  1. Systemctl t help 查看unit类型
  2. **Service unit: 文件扩展名为.service, 用于定义系统服务
  3. **Target unit: 文件扩展名为.target,用于模拟实现运行级别(简单定义下 runlevel)
  4. Device unit: .device, 用于定义内核识别的设备
  5. Mount unit: .mount, 定义文件系统挂载点
  6. **Socket unit: .socket,用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
  7. Snapshot unit: .snapshot, 管理系统快照
  8. Swap unit: .swap, 用于标识swap设备
  9. Automount unit: .automount,文件系统的自动挂载点(ls /misc/cd
  10. Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录
  11. 没有**一般不修改
  12. [root@centos7 system]#systemctl get-default //图形的默认级别
  13. graphical.target

特性

关键特性:
基于socket的激活机制:socket与服务程序分离
基于d-bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存各unit的当前状态信息于持久存储设备中向后兼容sysvinit脚本
不兼容:
systemctl命令固定不变,不可扩展
非由systemd启动的服务,systemctl无法与之通信和控制4
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注