乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      08_SHELL編程之文本處理工具awk

       路人甲Java 2022-11-15 發(fā)布于北京

      課程目標(biāo)

      • 熟悉awk的命令行模式基本語法結(jié)構(gòu)
      • 熟悉awk的相關(guān)內(nèi)部變量
      • 熟悉awk常用的打印函數(shù)print
      • 能夠在awk中匹配正則表達(dá)式打印相關(guān)的行

      一、awk介紹

      1. awk概述

      • awk是一種編程語言,主要用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理,是linux/unix下的一個工具。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個或多個文件,或其它命令的輸出。

      • awk的處理文本和數(shù)據(jù)的方式:逐行掃描文件,默認(rèn)從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進(jìn)行你想要的操作。

      • awk分別代表其作者姓氏的第一個字母。因?yàn)樗淖髡呤侨齻€人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。

      • gawk是awk的GNU版本,它提供了Bell實(shí)驗(yàn)室和GNU的一些擴(kuò)展。

      • 下面介紹的awk是以GNU的gawk為例的,在linux系統(tǒng)中已把a(bǔ)wk鏈接到gawk,所以下面全部以awk進(jìn)行介紹。

      2. awk能干啥?

      1. awk用來處理文件和數(shù)據(jù)的,是類unix下的一個工具,也是一種編程語言
      2. 可以用來統(tǒng)計數(shù)據(jù),比如網(wǎng)站的訪問量,訪問的IP量等等
      3. 支持條件判斷,支持for和while循環(huán)

      二、awk使用方式

      1. 命令行模式使用

      ㈠ 語法結(jié)構(gòu)

      awk 選項(xiàng) '命令部分' 文件名
      
      
      特別說明:
      引用shell變量需用雙引號引起
      
      

      ㈡ 常用選項(xiàng)介紹

      • -F 定義字段分割符號,默認(rèn)的分隔符是空格
      • -v 定義變量并賦值

      '命名部分說明'

      • 正則表達(dá)式,地址定位
      '/root/{awk語句}'				sed中: '/root/p'
      'NR==1,NR==5{awk語句}'			sed中: '1,5p'
      '/^root/,/^ftp/{awk語句}'  	sed中:'/^root/,/^ftp/p'
      
      • {awk語句1;awk語句2;...}
      '{print $0;print $1}'		sed中:'p'
      'NR==5{print $0}'				sed中:'5p'
      注:awk命令語句間用分號間隔
      
      • BEGIN...END....
      'BEGIN{awk語句};{處理中};END{awk語句}'
      'BEGIN{awk語句};{處理中}'
      '{處理中};END{awk語句}'
      

      2. 腳本模式使用

      ㈠ 腳本編寫

      #!/bin/awk -f 		定義魔法字符
      以下是awk引號里的命令清單,不要用引號保護(hù)命令,多個命令用分號間隔
      BEGIN{FS=":"}
      NR==1,NR==3{print $1"\t"$NF}
      ...
      

      ㈡ 腳本執(zhí)行

      方法1:
      awk 選項(xiàng) -f awk的腳本文件  要處理的文本文件
      awk -f awk.sh filename
      
      sed -f sed.sh -i filename
      
      方法2:
      ./awk的腳本文件(或者絕對路徑)	要處理的文本文件
      ./awk.sh filename
      
      ./sed.sh filename
      

      三、 awk內(nèi)部相關(guān)變量

      變量 變量說明 備注
      $0 當(dāng)前處理行的所有記錄
      $1,$2,$3...$n 文件中每行以間隔符號分割的不同字段 awk -F: '{print $1,$3}'
      NF 當(dāng)前記錄的字段數(shù)(列數(shù)) awk -F: '{print NF}'
      $NF 最后一列 $(NF-1)表示倒數(shù)第二列
      FNR/NR 行號
      FS 定義間隔符 'BEGIN{FS=":"};{print $1,$3}'
      OFS 定義輸出字段分隔符,默認(rèn)空格 'BEGIN{OFS="\t"};print $1,$3}'
      RS 輸入記錄分割符,默認(rèn)換行 'BEGIN{RS="\t"};{print $0}'
      ORS 輸出記錄分割符,默認(rèn)換行 'BEGIN{ORS="\n\n"};{print $1,$3}'
      FILENAME 當(dāng)前輸入的文件名

      1、常用內(nèi)置變量舉例

      # awk -F: '{print $1,$(NF-1)}' 1.txt
      # awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
      # awk '/root/{print $0}' 1.txt
      # awk '/root/' 1.txt
      # awk -F: '/root/{print $1,$NF}' 1.txt 
      root /bin/bash
      # awk -F: '/root/{print $0}' 1.txt      
      root:x:0:0:root:/root:/bin/bash
      # awk 'NR==1,NR==5' 1.txt 
      # awk 'NR==1,NR==5{print $0}' 1.txt
      # awk 'NR==1,NR==5;/^root/{print $0}' 1.txt 
      root:x:0:0:root:/root:/bin/bash
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      
      

      2、內(nèi)置變量分隔符舉例

      FS和OFS:
      # awk 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt
      # awk -F: 'BEGIN{OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' 1.txt        
      root            /bin/bash
      bin             /sbin/nologin
      daemon          /sbin/nologin
      adm             /sbin/nologin
      lp              /sbin/nologin
      # awk -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt     
      root@@@/bin/bash
      bin@@@/sbin/nologin
      daemon@@@/sbin/nologin
      adm@@@/sbin/nologin
      lp@@@/sbin/nologin
      [root@server shell07]# 
      
      RS和ORS:
      修改源文件前2行增加制表符和內(nèi)容:
      vim 1.txt
      root:x:0:0:root:/root:/bin/bash hello   world
      bin:x:1:1:bin:/bin:/sbin/nologin        test1   test2
      
      # awk 'BEGIN{RS="\t"};{print $0}' 1.txt
      # awk 'BEGIN{ORS="\t"};{print $0}' 1.txt
      

      四、 awk工作原理

      awk -F: '{print $1,$3}' /etc/passwd

      1. awk使用一行作為輸入,并將這一行賦給內(nèi)部變量$0,每一行也可稱為一個記錄,以換行符(RS)結(jié)束

      2. 每行被間隔符:(默認(rèn)為空格或制表符)分解成字段(或域),每個字段存儲在已編號的變量中,從$1開始

        問:awk如何知道用空格來分隔字段的呢?

        答:因?yàn)橛幸粋€內(nèi)部變量FS來確定字段分隔符。初始時,F(xiàn)S賦為空格

      3. awk使用print函數(shù)打印字段,打印出來的字段會以空格分隔,因?yàn)?1,$3之間有一個逗號。逗號比較特殊,它映射為另一個內(nèi)部變量,稱為輸出字段分隔符OFS,OFS默認(rèn)為空格

      4. awk處理完一行后,將從文件中獲取另一行,并將其存儲在$0中,覆蓋原來的內(nèi)容,然后將新的字符串分隔成字段并進(jìn)行處理。該過程將持續(xù)到所有行處理完畢

      五、awk使用進(jìn)階

      1. 格式化輸出printprintf

      print函數(shù)		類似echo "hello world"
      # date |awk '{print "Month: "$2 "\nYear: "$NF}'
      # awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
      
      
      printf函數(shù)		類似echo -n
      # awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}'  /etc/passwd
      # awk -F: '{printf "|%15s| %10s| %15s|\n", $1,$2,$3}' /etc/passwd
      # awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
      
      awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' a.txt
      
      %s 字符類型  strings			%-20s
      %d 數(shù)值類型	
      占15字符
      - 表示左對齊,默認(rèn)是右對齊
      printf默認(rèn)不會在行尾自動換行,加\n
      

      2. awk變量定義

      # awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd
      # awk -v NUM=3 -F: '{ print NUM }' /etc/passwd
      # awk -v num=1 'BEGIN{print num}' 
      1
      # awk -v num=1 'BEGIN{print $num}' 
      注意:
      awk中調(diào)用定義的變量不需要加$
      

      3. awk中BEGIN...END使用

      ? ①BEGIN:表示在程序開始前執(zhí)行

      ? ②END :表示所有文件處理完后執(zhí)行

      ? ③用法:'BEGIN{開始處理之前};{處理中};END{處理結(jié)束后}'

      ㈠ 舉例說明1

      打印最后一列和倒數(shù)第二列(登錄shell和家目錄)

      awk -F: 'BEGIN{ print "Login_shell\t\tLogin_home\n*******************"};{print $NF"\t\t"$(NF-1)};END{print "************************"}' 1.txt
      
      awk 'BEGIN{ FS=":";print "Login_shell\tLogin_home\n*******************"};{print $NF"\t"$(NF-1)};END{print "************************"}' 1.txt
      
      Login_shell		Login_home
      ************************
      /bin/bash		/root
      /sbin/nologin		/bin
      /sbin/nologin		/sbin
      /sbin/nologin		/var/adm
      /sbin/nologin		/var/spool/lpd
      /bin/bash		/home/redhat
      /bin/bash		/home/user01
      /sbin/nologin		/var/named
      /bin/bash		/home/u01
      /bin/bash		/home/YUNWEI
      ************************************
      

      ㈡ 舉例說明2

      打印/etc/passwd里的用戶名、家目錄及登錄shell

      u_name      h_dir       shell
      ***************************
      
      ***************************
      
      awk -F: 'BEGIN{OFS="\t\t";print"u_name\t\th_dir\t\tshell\n***************************"};{printf "%-20s %-20s %-20s\n",$1,$(NF-1),$NF};END{print "****************************"}'
      
      
      # awk -F: 'BEGIN{print "u_name\t\th_dir\t\tshell" RS "*****************"}  {printf "%-15s %-20s %-20s\n",$1,$(NF-1),$NF}END{print "***************************"}'  /etc/passwd
      
      格式化輸出:
      echo		print
      echo -n	printf
      
      {printf "%-15s %-20s %-20s\n",$1,$(NF-1),$NF}
      

      4. awk和正則的綜合運(yùn)用

      運(yùn)算符 說明
      == 等于
      != 不等于
      > 大于
      < 小于
      >= 大于等于
      <= 小于等于
      ~ 匹配
      !~ 不匹配
      ! 邏輯非
      && 邏輯與
      || 邏輯或

      ㈠ 舉例說明

      從第一行開始匹配到以lp開頭行
      awk -F: 'NR==1,/^lp/{print $0 }' passwd  
      從第一行到第5行          
      awk -F: 'NR==1,NR==5{print $0 }' passwd
      從以lp開頭的行匹配到第10行       
      awk -F: '/^lp/,NR==10{print $0 }' passwd 
      從以root開頭的行匹配到以lp開頭的行       
      awk -F: '/^root/,/^lp/{print $0}' passwd
      打印以root開頭或者以lp開頭的行            
      awk -F: '/^root/ || /^lp/{print $0}' passwd
      awk -F: '/^root/;/^lp/{print $0}' passwd
      顯示5-10行   
      awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd     
      awk -F: 'NR<10 && NR>5 {print $0}' passwd 
      
      打印30-39行以bash結(jié)尾的內(nèi)容:
      [root@MissHou shell06]# awk 'NR>=30 && NR<=39 && $0 ~ /bash$/{print $0}' passwd 
      stu1:x:500:500::/home/stu1:/bin/bash
      yunwei:x:501:501::/home/yunwei:/bin/bash
      user01:x:502:502::/home/user01:/bin/bash
      user02:x:503:503::/home/user02:/bin/bash
      user03:x:504:504::/home/user03:/bin/bash
      
      [root@MissHou shell06]# awk 'NR>=3 && NR<=8 && /bash$/' 1.txt  
      stu7:x:1007:1007::/rhome/stu7:/bin/bash
      stu8:x:1008:1008::/rhome/stu8:/bin/bash
      stu9:x:1009:1009::/rhome/stu9:/bin/bash
      
      打印文件中1-5并且以root開頭的行
      [root@MissHou shell06]# awk 'NR>=1 && NR<=5 && $0 ~ /^root/{print $0}' 1.txt
      root:x:0:0:root:/root:/bin/bash
      [root@MissHou shell06]# awk 'NR>=1 && NR<=5 && $0 !~ /^root/{print $0}' 1.txt
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      
      
      理解;號和||的含義:
      [root@MissHou shell06]# awk 'NR>=3 && NR<=8 || /bash$/' 1.txt
      [root@MissHou shell06]# awk 'NR>=3 && NR<=8;/bash$/' 1.txt
      
      
      打印IP地址
      # ifconfig eth0|awk 'NR>1 {print $2}'|awk -F':' 'NR<2 {print $2}'    
      # ifconfig eth0|grep Bcast|awk -F':' '{print $2}'|awk '{print $1}'
      # ifconfig eth0|grep Bcast|awk '{print $2}'|awk -F: '{print $2}'
      
      
      # ifconfig eth0|awk NR==2|awk -F '[ :]+' '{print $4RS$6RS$8}'
      # ifconfig eth0|awk -F"[ :]+" '/inet addr:/{print $4}'
      

      4. 課堂練習(xí)

      1. 顯示可以登錄操作系統(tǒng)的用戶所有信息 從第7列匹配以bash結(jié)尾,輸出整行(當(dāng)前行所有的列)
      [root@MissHou ~] awk '/bash$/{print $0}'    /etc/passwd
      [root@MissHou ~] awk '/bash$/{print $0}' /etc/passwd
      [root@MissHou ~] awk '/bash$/' /etc/passwd
      [root@MissHou ~] awk -F: '$7 ~ /bash/' /etc/passwd
      [root@MissHou ~] awk -F: '$NF ~ /bash/' /etc/passwd
      [root@MissHou ~] awk -F: '$0 ~ /bash/' /etc/passwd
      [root@MissHou ~] awk -F: '$0 ~ /\/bin\/bash/' /etc/passwd
      
      1. 顯示可以登錄系統(tǒng)的用戶名
      # awk -F: '$0 ~ /\/bin\/bash/{print $1}' /etc/passwd
      
      1. 打印出系統(tǒng)中普通用戶的UID和用戶名
      500	stu1
      501	yunwei
      502	user01
      503	user02
      504	user03
      
      
      # awk -F: 'BEGIN{print "UID\tUSERNAME"} {if($3>=500 && $3 !=65534 ) {print $3"\t"$1} }' /etc/passwdUID	USERNAME
      
      
      # awk -F: '{if($3 >= 500 && $3 != 65534) print $1,$3}' a.txt 
      redhat 508
      user01 509
      u01 510
      YUNWEI 511
      

      5. awk的腳本編程

      ㈠ 流程控制語句

      ① if結(jié)構(gòu)

      if語句:
      
      if [ xxx ];then
      xxx
      fi
      
      格式:
      awk 選項(xiàng) '正則,地址定位{awk語句}'  文件名
      
      { if(表達(dá)式){語句1;語句2;...}}
      
      awk -F: '{if($3>=500 && $3<=60000) {print $1,$3} }' passwd
      
      # awk -F: '{if($3==0) {print $1"是管理員"} }' passwd 
      root是管理員
      
      # awk 'BEGIN{if('$(id -u)'==0) {print "admin"} }'
      admin
      

      ② if...else結(jié)構(gòu)

      if...else語句:
      if [ xxx ];then
      	xxxxx
      	
      else
      	xxx
      fi
      
      格式:
      {if(表達(dá)式){語句;語句;...}else{語句;語句;...}}
      
      awk -F: '{ if($3>=500 && $3 != 65534) {print $1"是普通用戶"} else {print $1,"不是普通用戶"}}' passwd 
      
      awk 'BEGIN{if( '$(id -u)'>=500 && '$(id -u)' !=65534 ) {print "是普通用戶"} else {print "不是普通用戶"}}'
      
      

      ③ if...elif...else結(jié)構(gòu)

      if [xxxx];then
      	xxxx
      elif [xxx];then
      	xxx
      ....
      else
      ...
      fi
      
      
      if...else if...else語句:
      
      格式:
      { if(表達(dá)式1){語句;語句;...}else if(表達(dá)式2){語句;語句;...}else if(表達(dá)式3){語句;語句;...}else{語句;語句;...}}
      
      awk -F: '{ if($3==0) {print $1,":是管理員"} else if($3>=1 && $3<=499 || $3==65534 ) {print $1,":是系統(tǒng)用戶"} else {print $1,":是普通用戶"}}'
      
      
      awk -F: '{ if($3==0) {i++} else if($3>=1 && $3<=499 || $3==65534 ) {j++} else {k++}};END{print "管理員個數(shù)為:"i "\n系統(tǒng)用戶個數(shù)為:"j"\n普通用戶的個數(shù)為:"k }'
      
      
      # awk -F: '{if($3==0) {print $1,"is admin"} else if($3>=1 && $3<=499 || $3==65534) {print $1,"is sys users"} else {print $1,"is general user"} }' a.txt 
      
      root is admin
      bin is sys users
      daemon is sys users
      adm is sys users
      lp is sys users
      redhat is general user
      user01 is general user
      named is sys users
      u01 is general user
      YUNWEI is general user
      
      awk -F: '{  if($3==0) {print $1":管理員"} else if($3>=1 && $3<500 || $3==65534 ) {print $1":是系統(tǒng)用戶"} else {print $1":是普通用戶"}}'   /etc/passwd
      
      
      awk -F: '{if($3==0) {i++} else if($3>=1 && $3<500 || $3==65534){j++} else {k++}};END{print "管理員個數(shù)為:" i RS "系統(tǒng)用戶個數(shù)為:"j RS "普通用戶的個數(shù)為:"k }' /etc/passwd
      管理員個數(shù)為:1
      系統(tǒng)用戶個數(shù)為:28
      普通用戶的個數(shù)為:27
      
      
      # awk -F: '{ if($3==0) {print $1":是管理員"} else if($3>=500 && $3!=65534) {print $1":是普通用戶"} else {print $1":是系統(tǒng)用戶"}}' passwd 
      
      awk -F: '{if($3==0){i++} else if($3>=500){k++} else{j++}} END{print i; print k; print j}' /etc/passwd
      
      awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理員個數(shù): "i; print "普通用個數(shù): "k; print "系統(tǒng)用戶: "j}' /etc/passwd 
      
      如果是普通用戶打印默認(rèn)shell,如果是系統(tǒng)用戶打印用戶名
      # awk -F: '{if($3>=1 && $3<500 || $3 == 65534) {print $1} else if($3>=500 && $3<=60000 ) {print $NF} }' /etc/passwd
      

      ㈡ 循環(huán)語句

      ① for循環(huán)

      打印1~5
      for ((i=1;i<=5;i++));do echo $i;done
      
      # awk 'BEGIN { for(i=1;i<=5;i++) {print i} }'
      打印1~10中的奇數(shù)
      # for ((i=1;i<=10;i+=2));do echo $i;done|awk '{sum+=$0};END{print sum}'
      # awk 'BEGIN{ for(i=1;i<=10;i+=2) {print i} }'
      # awk 'BEGIN{ for(i=1;i<=10;i+=2) print i }'
      
      計算1-5的和
      # awk 'BEGIN{sum=0;for(i=1;i<=5;i++) sum+=i;print sum}'
      # awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);{print sum}}'
      # awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);print sum}'
      

      ② while循環(huán)

      打印1-5
      # i=1;while (($i<=5));do echo $i;let i++;done
      
      # awk 'BEGIN { i=1;while(i<=5) {print i;i++} }'
      打印1~10中的奇數(shù)
      # awk 'BEGIN{i=1;while(i<=10) {print i;i+=2} }'
      計算1-5的和
      # awk 'BEGIN{i=1;sum=0;while(i<=5) {sum+=i;i++}; print sum }'
      # awk 'BEGIN {i=1;while(i<=5) {(sum+=i) i++};print sum }'
      

      ③ 嵌套循環(huán)

      嵌套循環(huán):
      #!/bin/bash
      for ((y=1;y<=5;y++))
      do
      	for ((x=1;x<=$y;x++))
      	do
      		echo -n $x	
      	done
      echo
      done
      
      awk 'BEGIN{ for(y=1;y<=5;y++) {for(x=1;x<=y;x++) {printf x} ;print } }'
      
      
      # awk 'BEGIN { for(y=1;y<=5;y++) { for(x=1;x<=y;x++) {printf x};print} }'
      1
      12
      123
      1234
      12345
      
      # awk 'BEGIN{ y=1;while(y<=5) { for(x=1;x<=y;x++) {printf x};y++;print}}'
      1
      12
      123
      1234
      12345
      
      嘗試用三種方法打印99口訣表:
      #awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) {printf x"*"y"="x*y"\t"};print} }'
      
      #awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) printf x"*"y"="x*y"\t";print} }'
      #awk 'BEGIN{i=1;while(i<=9){for(j=1;j<=i;j++) {printf j"*"i"="j*i"\t"};print;i++ }}'
      
      #awk 'BEGIN{for(i=1;i<=9;i++){j=1;while(j<=i) {printf j"*"i"="i*j"\t";j++};print}}'
      
      循環(huán)的控制:
      break		條件滿足的時候中斷循環(huán)
      continue	條件滿足的時候跳過循環(huán)
      # awk 'BEGIN{for(i=1;i<=5;i++) {if(i==3) break;print i} }'
      1
      2
      # awk 'BEGIN{for(i=1;i<=5;i++){if(i==3) continue;print i}}'
      1
      2
      4
      5
      

      6. awk算數(shù)運(yùn)算

      + - * / %(模) ^(冪2^3)
      可以在模式中執(zhí)行計算,awk都將按浮點(diǎn)數(shù)方式執(zhí)行算術(shù)運(yùn)算
      # awk 'BEGIN{print 1+1}'
      # awk 'BEGIN{print 1**1}'
      # awk 'BEGIN{print 2**3}'
      # awk 'BEGIN{print 2/3}'
      

      六、awk統(tǒng)計案例

      1、統(tǒng)計系統(tǒng)中各種類型的shell

      # awk -F: '{ shells[$NF]++ };END{for (i in shells) {print i,shells[i]} }' /etc/passwd
      
      books[linux]++
      books[linux]=1
      shells[/bin/bash]++
      shells[/sbin/nologin]++
      
      /bin/bash 5
      /sbin/nologin 6
      
      shells[/bin/bash]++			a
      shells[/sbin/nologin]++		b
      shells[/sbin/shutdown]++	c
      
      books[linux]++
      books[php]++
      
      

      2、統(tǒng)計網(wǎng)站訪問狀態(tài)

      # ss -antp|grep 80|awk '{states[$1]++};END{for(i in states){print i,states[i]}}'
      TIME_WAIT 578
      ESTABLISHED 1
      LISTEN 1
      
      # ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}'
      LISTEN 1
      ESTAB 5
      TIME-WAIT 25
      
      # ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}' |sort -k2 -rn
      TIME-WAIT 18
      ESTAB 8
      LISTEN 1
      
      

      3、統(tǒng)計訪問網(wǎng)站的每個IP的數(shù)量

      # netstat -ant |grep :80 |awk -F: '{ip_count[$8]++};END{for(i in ip_count){print i,ip_count[i]} }' |sort
      
      
      # ss -an |grep :80 |awk -F":" '!/LISTEN/{ip_count[$(NF-1)]++};END{for(i in ip_count){print i,ip_count[i]}}' |sort -k2 -rn |head
      

      4、統(tǒng)計網(wǎng)站日志中PV量

      統(tǒng)計Apache/Nginx日志中某一天的PV量  <統(tǒng)計日志>
      # grep '27/Jul/2017' mysqladmin.cc-access_log |wc -l
      14519
      
      統(tǒng)計Apache/Nginx日志中某一天不同IP的訪問量 <統(tǒng)計日志>
      # grep '27/Jul/2017' mysqladmin.cc-access_log |awk '{ips[$1]++};END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head
      
      # grep '07/Aug/2017' access.log |awk '{ips[$1]++};END{for(i in ips){print i,ips[i]} }' |awk '$2>100' |sort -k2 -rn
      
      

      名詞解釋:

      網(wǎng)站瀏覽量(PV)
      名詞:PV=PageView (網(wǎng)站瀏覽量)
      說明:指頁面的瀏覽次數(shù),用以衡量網(wǎng)站用戶訪問的網(wǎng)頁數(shù)量。多次打開同一頁面則瀏覽量累計。用戶每打開一個頁面便記錄1次PV。

      名詞:VV = Visit View(訪問次數(shù))
      說明:從訪客來到您網(wǎng)站到最終關(guān)閉網(wǎng)站的所有頁面離開,計為1次訪問。若訪客連續(xù)30分鐘沒有新開和刷新頁面,或者訪客關(guān)閉了瀏覽器,則被計算為本次訪問結(jié)束。

      獨(dú)立訪客(UV)
      名詞:UV= Unique Visitor(獨(dú)立訪客數(shù))
      說明:1天內(nèi)相同的訪客多次訪問您的網(wǎng)站只計算1個UV。

      獨(dú)立IP(IP)
      名詞:IP=獨(dú)立IP數(shù)
      說明:指1天內(nèi)使用不同IP地址的用戶訪問網(wǎng)站的數(shù)量。同一IP無論訪問了幾個頁面,獨(dú)立IP數(shù)均為1

      七、課后作業(yè)

      作業(yè)1:
      1、寫一個自動檢測磁盤使用率的腳本,當(dāng)磁盤使用空間達(dá)到90%以上時,需要發(fā)送郵件給相關(guān)人員
      2、寫一個腳本監(jiān)控系統(tǒng)內(nèi)存和交換分區(qū)使用情況

      作業(yè)2:
      輸入一個IP地址,使用腳本判斷其合法性:
      必須符合ip地址規(guī)范,第1、4位不能以0開頭,不能大于255不能小于0

      八、企業(yè)實(shí)戰(zhàn)案例

      1. 任務(wù)/背景

      web服務(wù)器集群中總共有9臺機(jī)器,上面部署的是Apache服務(wù)。由于業(yè)務(wù)不斷增長,每天每臺機(jī)器上都會產(chǎn)生大量的訪問日志,現(xiàn)需要將每臺web服務(wù)器上的apache訪問日志保留最近3天的,3天以前的日志轉(zhuǎn)儲到一臺專門的日志服務(wù)器上,已做后續(xù)分析。如何實(shí)現(xiàn)每臺服務(wù)器上只保留3天以內(nèi)的日志?

      2. 具體要求

      1. 每臺web服務(wù)器的日志對應(yīng)日志服務(wù)器相應(yīng)的目錄里。如:web1——>web1.log(在日志服務(wù)器上)
      2. 每臺web服務(wù)器上保留最近3天的訪問日志,3天以前的日志每天凌晨5:03分轉(zhuǎn)儲到日志服務(wù)器
      3. 如果腳本轉(zhuǎn)儲失敗,運(yùn)維人員需要通過跳板機(jī)的菜單選擇手動清理日志

      3. 涉及知識點(diǎn)

      1. shell的基本語法結(jié)構(gòu)
      2. 文件同步rsync
      3. 文件查找命令find
      4. 計劃任務(wù)crontab
      5. apache日志切割
      6. 其他

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約