日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Shell awk文本处理,shell脚本编写

發(fā)布時(shí)間:2024/7/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shell awk文本处理,shell脚本编写 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

一:內(nèi)容包含awk、變量、運(yùn)算符、if多分支

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

command

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

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

<e>NR變量定址?

  NR 表示AWK讀入的行數(shù)
  FNR表示讀入行所在文件中的行數(shù)
  # 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
    #
  邏輯運(yùn)算 可直接引用域進(jìn)行運(yùn)算
    == >= <= != > < ~ !~
    # 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 當(dāng)前記錄的個(gè)數(shù)(全部文件連接后的統(tǒng)計(jì))?
  FNR 當(dāng)前記錄的個(gè)數(shù)(僅為當(dāng)前文件的統(tǒng)計(jì),非全部)
  FS 字段分隔符 默認(rèn)為連續(xù)空格或制表符,可以使用多個(gè)不同的符號(hào)做分隔符 -F[:/]
  OFS 輸出字符的分隔符 默認(rèn)是空格
  # awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
  root=====x
  NF 當(dāng)前讀入行的字段個(gè)數(shù)
  ORS 輸出記錄分隔符 默認(rèn)是換行
  # awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
  root x=====bin x=====
  FILENAME 當(dāng)前文件名

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

操作符
  賦值
    = += -= /= *=?
  邏輯與 邏輯或 邏輯非
    && || !
  匹配正則或不匹配,正則需要用 /正則/ 包圍住
    ~ !~
  關(guān)系 比較字符串時(shí)要把字符串用雙引號(hào)引起來(lái)
    < <= > >= != ==
  字段引用
    $ 字段引用需要加$,而變量引用直接用變量名取
運(yùn)算符
  + - * / % ++ --
  轉(zhuǎn)義序列
  \\ \自身
  \$ 轉(zhuǎn)義$
  \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條件 ? 動(dòng)作1 : 動(dòng)作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

  

常用系統(tǒng)變量?

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

算術(shù)運(yùn)算符

  +

  -

  *

  /

  %

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

part2 關(guān)系操作

  <?

  >?

  <=

  >=

  ==

  !=

  &&

  ||

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

part3 賦值運(yùn)算符

  =

  +=

  *=

  /=

  %=

#!/bin/bash

var='/etc/init.d'

#var='/dev/sda'

if多分支

if (條件) 動(dòng)作
若有多個(gè)動(dòng)作,則要用大括號(hào)將動(dòng)作體包含起來(lái) if (條件) {動(dòng)作1;動(dòng)作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)
動(dòng)作1
  else
動(dòng)作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
上面兩個(gè)命令是等價(jià)的,要么用分號(hào)隔開(kāi),表示第一個(gè)動(dòng)作體的結(jié)束,要么將動(dòng)作體用大括號(hào)定位范圍
  if (條件 1)
動(dòng)作1
  else if(條件 2)
動(dòng)作2
  else if(條件 3)
動(dòng)作3
  else
動(dòng)作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

條件 ? 動(dòng)作1 : 動(dòng)作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 ]thenecho "$var is directory"elif [ -b $var ]thenecho "$var is block"elif [ -f $var ]thenecho "$var is regular file"elseecho 'unknow'fi

  

?

二:awk文本處理

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

三:shell腳本編寫
自動(dòng)部署、初始配置、并啟動(dòng)nginx反向代理服務(wù)

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?
監(jiān)控腳本:監(jiān)控每臺(tái)機(jī)器的內(nèi)存使用率>70%,則輸出報(bào)警信息
(思路提示:
[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?"警報(bào)信息"
else
??????echo?"正常"
fi?

?

???????? )

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/xuaijun/p/6605610.html

總結(jié)

以上是生活随笔為你收集整理的Shell awk文本处理,shell脚本编写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。