Linux--shell的awk--10

1、awk介紹

全稱:由Aho Weinberger Kernaighan三我的的首字母組合而成html

1970年第一次出如今Unix機器上,後來在開源領域使用它shell

awk是一種單獨的編程語言解釋器express

awk報告生成器:經過模式匹配以及本身自己的語言格式,來獲取並輸出客戶所須要的內容編程

示例:獲取系統上面用戶id大於1小於等於500的用戶的用戶名和用戶ID數組

awk -F: '{if($3>=1&&<=500){print $1,$3}}' /etc/passwd

2、awk工做原理

一、依次把匹配到的行,使用awk工具進行編輯bash

二、$0表示整行,$1表明第一個…,$NF表明最後一個tcp

三、pattern;經過模式匹配對應的字段過濾行;編程語言

四、經過對應的命令 printf 作格式化輸出函數

3、awk用法

awk [option] … 'program' FILE

注意:

一、program 必須使用單引號工具

二、多條program語句使用大括號包含起來,能夠並列、嵌套    

awk '{print}' /etc/passwd   #默認打印$0

4、awk常見選項(option)

-F  指定分隔符,默認是空格

  -F[:\] 指定多個分隔符

例: awk -F[:\] '{print $3,$5,$7}' /etc/passwd   指定 : 和 / 爲分隔符

-v  手動指定變量參數

awk -v a="a/b" 'print a' a.txt

  一、a是自定義變量

  二、在awk中調用變量不用加$符號

cut與awk的區別

  awk 以空格爲分割域時,是以單個或多個連續的空格爲分隔符的;

cut則是以單個空格做爲分隔符。

5、awk的語法格式----program

一、print

默認輸出(在屏幕上)

在awk中沒有保存命令,咱們能夠關聯其餘命令(tee)來保存

二、printf  實現格式化輸出

輸出格式:printf  "xxx %-10s xxx %-10d ",name,num

格式符:

  %s   顯示字符串

  %d %i  顯示數值

  %c   顯示ASCII

  %e %E 科學計算方式

  %f    顯示浮點數

  %u  無符號整數

  %%   逃逸符,只顯示%本身

修飾符:

  默認爲右對齊

  -        表明左對齊

    %5.4f  表明佔位數爲5,小數位有4位  

三、變量

內置變量----環境變量(bash)

  awk語言所默認支持的變量

  FS   定義輸入分隔符的變量

  OFS  定義輸出分隔符的變量

  NF($NF) 分割之後的最後一列的變量,變量引用的時候不用加$

  NR  定義文件的行數,定義多個文件的時候,行號疊加

  FNR 定義文件行數時,只計算本身的行號

  FILENAME  存儲文件名字

  BEGIN  只執行一次後面的命令

awk 'BEGIN{print "xxx"}{print$3}' /etc/passwd

  ARGC  整個 命令參數 的段數  不包含ARGC命令自己

  ARGV  用來調取命令中指定的段

awk '{print ARGC}' /etc/passwd       ==  2
awk '{print ARGV[2]}' /etc/passwd    == /etc/passwd

  RS  指定換行符,默認爲\n,能夠指定新的換行符,不影響默認符號

  ORS  輸出時替換默認換行符

awk -v ORS="@" '{print}' /etc/passwd

  自定義變量

    -v 變量=值

在後面’program’中去調用自定義變量時,直接使用便可或者將」變量=值」語句寫到program便可

四、模式匹配(地址定界)

a) 空值,沒有定義,默認就將文件中全部行放入awk中進行循環

b) 對m~n行進行操做

awk 'NR>=1&&NR<=3{print}' /etc/passwd     打印1到3行

c) pattern匹配的行 /pattern/

awk '/r..t/{print}' /etc/passwd

d) /pattern1/,/pattern2/ 第一次pattern1到第一次匹配pattern2的行

awk '/root/,/user1/{print}' /etc/passwd

練習:判斷/patern1/,/pattern2/之間行的用戶是bash用戶,並顯示用戶名

awk -F: '/^root/,/user1/{if($NF=="/bin/bash");print $1,$3}' /etc/passwd

e) 模式匹配能夠直接使用判斷語句

awk -F: '$NF=="/bin/bash"{print $1 $3}' /etc/passwd

f) BEGIN定義在默認循環進行操做前所要執行的語句

awk -F: 'BEGIN{printf "shell程序爲bash:\n"}$NF=="/bin/bash"{print $1,$3}' /etc/passwd

g) END 定義在循環結束後執行

awk -F: $NF=="/bin/bash"{print $1,$3} 'END{printf "end\n"}' /etc/passwd

五、操做符

運算操做符

  +  -  *  /  %  ^(乘方)  //

比較運算符

  >  <  ==  !=  >=  <=  ~(等於)  !~

awk -F: '-FS~"/bin/bash" {print $1,$3}' /etc/passwd

邏輯操做符

  &&  ||  !

賦值操做符

  =  +=  -=  /=  *=  %=  ^=  //=

條件表達式

  條件語句? 條件成立語句;條件不成立語句

awk '/^title/{NF<=2? print; print "參數過少"}' /boot/grub/grub.conf

六、常見action

  print printf 以及它任何命令的操做都是action

a) expressions

b) input statements輸入語句

c) 組合語句 compound statements /pat1/{{ }{ }}

d) control statements 控制語句 例如 if  while等

e) output statements 輸出語句

七、常見語言

a) if語句

  語法格式:if(條件表達式){執行語句} else {執行語句}

awk '/^title/{if(NF<=2){print} else {print "error"}}' /boot/grub/grub.conf

b) while語句

  只有對行參數進行遍歷的時候才使用while語句

  語法格式:初始值 while(條件表達式){循環體;初始控制語句}

c) for語句

  語法格式:for(初始值;條件判斷;初始值控制語句){循環體}

d) do-while語句

  語法格式:do {循環體} while (循環條件)

e) 跳出循環語句

  break [n]  跳出n次循環

  continue  跳出本次循環

  next      跳出默認的當前循環  NR%2==1 next 跳過奇數行

awk '{if(NR%2==1){next}else{print}}' /etc/passwd

f) switch語句(相似case)

  語法格式:switch(表達式){case 模式匹配值:執行語句;case …,default:執行語句}

八、數組

在awk中,數組和shell中的數組特性相同

注意:awk中數組不用定義,只要使用,就有值爲空的默認數組

行遍歷:整個文件進行遍歷

列遍歷:取對象的某一列進行遍歷

注意:數組經過for語句,再給其餘變量進行賦值時,賦的是索引信息

練習統計/etc/fstab中每一個單詞(以空格隔開的詞)的次數

awk -v RS=" " '{print}' /etc/fstab | awk '{a[$1]++}END{for(i in a){printf "%-50s = %-2d\n",i,a[i]}}'

九、函數

內置函數:

  length()  統計字符串長度

    數學上使用的函數 sin() cos() tan() …

  sub(x,x,x)  替換第一個匹配到的值

awk -F: '{print sub(o,O,$1) }' /etc/passw第一列第一個o替換爲O

  gsub(x,x,x)  替換該行全部匹配到的全部值

awk -F: '{print gsub(o,O,$1) }' /etc/passwd第一列全部o替換爲O

  split(x,x,x)  指定分隔符去切割文件

netstat -tan | awk '/^tcp\>/{split($5,ip,":");print ip[1]}'

原文出處:https://www.cnblogs.com/gxnihao/p/11419882.html

相關文章
相關標籤/搜索