Shell awk文本處理,shell腳本編寫


Shell awk文本處理,shell腳本編寫

一:內容包含awk、變量、運算符、if多分支

<a>語法糖:
awk [options] 'commands' files
option
  -F  定義字段分隔符,默認的分隔符是連續的空格或制表符
     使用option中的-F參數定義間隔符號
     用$1,$2,$3等的順序表示files中每行以間隔符號分隔的各列不同域
     NF變量表示當前記錄的字段數
  -v  定義變量並賦值 也可以借用次方式從shell變量中引入

command

<b>讀前處理 行處理 讀后處理:
  1.讀前處理 BEGIN{awk_cmd1;awk_cmd2}
  2.行處理:定址 命令 
  定址方法: 正則,變量,比較和關系運算
<c>正則需要用//包圍起來 
    ^ 行首
    $ 行尾
    . 除了換行符以外的任意單個字符
    * 前導字符的零個或多個
    .* 所有字符
    [] 字符組內的任一字符
    [^] 對字符組內的每個字符取反(不匹配字符組內的每個字符)
    ^[^] 非字符組內的字符開頭的行
    [a-z] 小寫字母
    [A-Z] 大寫字母
    [a-Z] 小寫和大寫字母
    [0-9] 數字
    \< 單詞頭 單詞一般以空格或特殊字符做分隔,連續的字符串被當做單詞
    \> 單詞尾

<d>擴展正則 加 -r 參數 或轉義
  sed -n '/roo\?/p' /etc/passwd 
  sed -rn '/roo?/p' /etc/passwd
  ? 前導字符零個或一個
  + 前導字符一個或多個
  abc|def abc或def
  a(bc|de)f abcf 或 adef
  x\{m\} x出現m次
  x\{m,\} x出現m次至多次(至少m次)
  x\{m,n\} x出現m次至n次

<e>NR變量定址 

  NR 表示AWK讀入的行數
  FNR表示讀入行所在文件中的行數
  # awk '{print NR,FNR,$1}' file1 file2 
    1 1 aaaaa
    2 2 bbbbb
    3 3 ccccc
    4 1 dddddd
    5 2 eeeeee
    6 3 ffffff
    #
  邏輯運算 可直接引用域進行運算
    == >= <= != > < ~ !~
    # awk 'NR==1 {print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    # 
  3.命令 {print $0}
  4.讀后處理 END {awk_cmd1;awk_cmd2;}
<f>AWK變量
  NR 當前記錄的個數(全部文件連接后的統計) 
  FNR 當前記錄的個數(僅為當前文件的統計,非全部)
  FS 字段分隔符 默認為連續空格或制表符,可以使用多個不同的符號做分隔符 -F[:/]
  OFS 輸出字符的分隔符 默認是空格
  # awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
  root=====x
  NF 當前讀入行的字段個數
  ORS 輸出記錄分隔符 默認是換行
  # awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
  root x=====bin x=====
  FILENAME 當前文件名

  引用shell變量的方法
  # a=root
  # awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
  或者 把整個命令拆開傳遞,讓shell變量外露,
  # awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
  # a=NF
  # awk -F: '{print $'$a'}' /etc/passwd 

操作符
  賦值
    = += -= /= *= 
  邏輯與 邏輯或 邏輯非
    && || !
  匹配正則或不匹配,正則需要用 /正則/ 包圍住
    ~ !~
  關系 比較字符串時要把字符串用雙引號引起來
    < <= > >= != ==
  字段引用
    $ 字段引用需要加$,而變量引用直接用變量名取
運算符
  + - * / % ++ --
  轉義序列
  \\ \自身
  \$ 轉義$
  \t 制表符
  \b 退格符
  \r 回車符
  \n 換行符
  \c 取消換行

# awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwd
root
2
3
...
33
/home/seker
/bin/bash
36

條件 ? 動作1 : 動作2
expr?action1:action2
# awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}' /etc/passwd
# awk -F: '{print ($3>500?$1:$2)}' /etc/passwd

  

常用系統變量 

  PATH
  PWD
  LANG
  HOME
  HISTSIZE
  PS1
  IFS
域分隔符 是空格,換行,TAB鍵的合集

算術運算符

  +

  -

  *

  /

  %

[root@MiWiFi-R3-srv ~]# echo $[3+1]
            輸出結果:4

part2 關系操作

  < 

  > 

  <=

  >=

  ==

  !=

  &&

  ||

[root@MiWiFi-R3-srv ~]# 
[root@MiWiFi-R3-srv ~]# x=1
[root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
[root@MiWiFi-R3-srv ~]# echo $?
            0

part3 賦值運算符

  =

  +=

  *=

  /=

  %=

#!/bin/bash

var='/etc/init.d'

#var='/dev/sda'

if多分支

if (條件) 動作
若有多個動作,則要用大括號將動作體包含起來 if (條件) {動作1;動作2}
  # awk -F: '{if ($1 == "root") print $1}' /etc/passwd
  root
  # 
  # awk -F: '{if ($1 == "root") {print $1;print $6}}' /etc/passwd
  root
  /root
  #

if (條件1)
動作1
  else
動作2
  # awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd
  # awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd
上面兩個命令是等價的,要么用分號隔開,表示第一個動作體的結束,要么將動作體用大括號定位范圍
  if (條件 1)
動作1
  else if(條件 2)
動作2
  else if(條件 3)
動作3
  else
動作4
  # awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwd
  root
  2
  3
  ...
  33
  /home/seker
  /bin/bash
  36

條件 ? 動作1 : 動作2

expr?action1:action2
# awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}' /etc/passwd
# awk -F: '{print ($3>500?$1:$2)}' /etc/passwd

if [ -d $var ]

    then

        echo "$var is directory"

elif [ -b $var ]

    then

        echo "$var is block"

elif [ -f $var ]

    then

        echo "$var is regular file"

else

        echo 'unknow'

fi

  

 

二:awk文本處理

打印uid在30~40范圍內的用戶名。
  awk -F: '$3 >=30 &&  $3<=40 {print $1}' passwd 
打印第5-10行的行號和用戶名
  awk -F: 'NR>=5 && NR<=10{print NR,$1}' passwd 
打印奇數行
  [root@python_lb yan]# awk -F: '{if(NR%2==1) print $0}' passwd 
打印偶數行
  [root@python_lb yan]#awk -F: '{if(NR%2==0) print $0}' passwd 
打印字段數大於5的行
  [root@python_lb yan]# awk -F: 'NF>5{print $0}' passwd 
打印UID不等於GID的用戶名
  awk -F: '$3!=$4{print $1}' passwd 
打印沒有指定shell的用戶
   awk -F: '$7==""{print $1}' passwd 

三:shell腳本編寫
自動部署、初始配置、並啟動nginx反向代理服務

systemctl stop firewalld.service
setenforce 0 
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux 
iptables -F
yum install -y epel-release
yum install -y nginx 
systemctl start nginx.service 
監控腳本:監控每台機器的內存使用率>70%,則輸出報警信息
(思路提示:
[root@www ~]# ((80>70))
[root@www ~]# echo $?
0

#!/bin/bash
mem_total=`free |awk 'NR==2{print $2}'`
mem_userd=`free|awk 'NR==2{print $3}'`
mem_per=`echo "scale=2;${mem_userd}/${mem_total}"|bc -l|cut -d. -f2`
if [ $mem_per -gt 70 ]
then 
     echo "警報信息"
else
      echo "正常"
fi 

 

         )

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM