1. 程式人生 > 實用技巧 >一、shell簡明筆記

一、shell簡明筆記

目錄

1 shell介紹

  • 什麼是shell

    shell是一個程式,採用c語言編寫,是使用者和linux核心溝通的橋樑,它既是一種命令語句,又是一種解釋性的程式語言

    kernel <----> shell <----> user

    • kernel:為軟體服務,接收使用者或軟體指令驅動硬體,完成工作
    • shell :命令直譯器
    • user:使用者介面,對接使用者
  • shell的功能

    • 命令列解釋功能
    • 啟動程式
    • 輸入輸出重定向
    • 管道連線
    • 檔名置換(echo /*)
    • 變數維護
    • 環境控制
    • shell程式設計

2 shell語法

shell指令碼就是,將完成一個任務的所有的命令,按照執行的先後順序,自上而下寫入到一個文字檔案,然後給予執行許可權

  • 如何書寫一個shell指令碼

    • shell指令碼的命名

      名字要有意義,建議用.sh結尾,且見名知意,如check_memory.sh

    • shell指令碼格式

      • shell指令碼開頭必須指定指令碼執行環境,以#!
        這個特殊符號組合來組成

      #!/bin/bash #指定該指令碼是執行解析由/bin/bash來完成的

      • shell中的註釋使用#

        #定義指令碼執行環境
        #!/usr/bin/bash
        
        
        #shell指令碼中,最好加入指令碼說明欄位
        #! /usr/bin/bash
        #Author: xxx
        #Created Time: 2020/09/06 21:52
        #Release:1.0
        #Script Description: first shell study script
        
        #指令碼組成
        # 解釋環境 #!/usr/bin/bash
        # 註釋說明
        # 執行程式碼
        
  • shell指令碼執行

    • 指令碼執行需要執行許可權,給一個檔案賦予執行許可權後,該指令碼就可以執行

      chmod 700 filename

    • 如果不希望賦予指令碼執行許可權,可以使用bash命令來執行未給予執行許可權的指令碼

      bash filename

  • shell中的特殊符號

    特殊符號 描述
    ~ 家目錄, # cd ~ 代表進入使用者家目錄
    ! 執行歷史命令,!!執行上一條命令
    $ 變數中取內容符
    +、-、*、/、% 對應數學運算,加、減、乘、除、取餘數
    & 後臺執行
    * 星號是shell中的萬用字元 匹配所有
    問號是shell中的萬用字元 匹配除回車以外的一個字元
    ; 分號可以在shell中一行執行多個命令,命令之間用分號分隔
    | 管道符 上一個命令的輸出作為下一個命令的輸入 cat filename | gerp “abc”
    \ 轉義字元
    `` 反引號,命令中執行命令 echo “today is date +%F
    單引號,指令碼中字串要用單引號引起來,但是不同於雙引號的是,單引號不解釋變數
    雙引號,指令碼中出現的字串可以用雙引號引起來
  • 管道

    | 管道符在shell中使用是最多的,很多組合命令都需要通過組合命令來完成輸出
      管道符其實就是上一個命令的輸出作為下一個命令的輸入
    
  • 重定向

    >   重定向輸入 覆蓋原資料
    >>  重定向追加輸入,在原資料的末尾新增
    <   重定向輸出         #wc -l < /etc/passwd
    >>  重定向追加輸出      #fdisk /dev/sdb <<EOF ...... EOF
    
  • shell中數學運算

    expr 命令:只能做整數運算,格式比較古板,注意空格
    # expr 1 + 1
    # expr 1 \* 2   --注意*出現時應該轉義,否則認為是萬用字元
    
    --擴充套件
    #echo 7 + 1
    #echo $?   --$?能夠判斷上一個命令執行是否成功,成功則返回0,否則返回其他數字
    #expr 7 + 1.1 &>/dev/null ; echo $?  --/dev/null 代表回收站
    
    --複合命令
    #echo "當前記憶體使用率:" `echo "scale=2;141*100/7988"|bc`%" 使用率"
    
    --雙小圓括號運算,在shell中(()),也可以用來做數學運算
    #echo $((100+3))
    
  • 指令碼退出

    exit NUM 退出指令碼,釋放系統資源,NUM代表一個整數,代表返回值.
    

3 shell格式化輸出

一個程式需要有0個或以上輸入,一個或更多輸出

  • echo命令介紹

    • **功能: **將內容輸出到預設顯示裝置

      echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用.
      
    • **語法: ** echo [-ne][字串]

      --補充說明
      echo會將輸入的字串送往標準輸出.輸出的字串間以空白字元隔開,並在最後加上換行號.
      
      --命令選項
      -n 不要在最後自動換行
      -e 若字串中出現以下字元,則特別加以處理,而不會將它當成一般文字輸出:
         轉義字元
             \a 發出警告聲
             \b 刪除前一個字元
             \c 最後不加上換行符號
             \f 換行但游標仍舊停留在原來的位置
             \n 換行且游標移至行首
             \r 游標移至行首,但不換行
             \t 插入tab
             \v 與\f相同
             \插入\字元
             \nnn插入nnn(八進位制)所代表的ASCII字元
             -help 顯示幫助
             -version 顯示版本資訊
      
      #!/bin/bash
      for time in `seq 9 -1 0`;do
      	echo -n -e "\b$time"
      	sleep 1
      done
      echo 
      

4 shell基本輸入

  • read命令

    預設接受鍵盤的輸入,回車符代表輸入結束

    --read命令選項
    -p  列印資訊
    -t  限定時間
    -s  不回顯
    -n  輸入字元個數
    
    #!/bin/bash
    clear
    echo -n -e "Login: "
    read login
    echo -n -e "Password: "
    read -t5 -s -n6 password
    echo "account: $login password: $password"
    

5 變數

  • 變數介紹

    計算機的單位:
    1B=8bit
    1KB=1024B
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    1PB=1024TB
    1EB=1024PB
    1ZB=1024EB
    ...
    
    • **定義: **變數是程式設計中最常用的一種臨時在記憶體中存取資料的一種方式
  • 變數分類

    1. 本地變數: 使用者私有變數,只有本地使用者可以使用,儲存在家目錄下的.bash_profile、.bashrc檔案中
    2. 全域性變數: 所有使用者都可以使用,儲存在/etc/profile、/etc/bashrc檔案中
    3. 使用者自定義變數: 使用者自定義,比如指令碼中的變數
  • 定義變數

    • 變數格式: 變數名=值

      在shell程式設計中的變數名和等號之間不能有空格

      變數名命名規則:
      	1.命名只能使用英文字母,數字和下劃線,首個字母不能以數字開頭
      	2.中間不能有空格,可以使用下劃線"_"
      	3.不能使用標點符號
      	4.不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)
      	
      注意:
      	1.字串要用單引號或雙引號引起來
      
  • 讀取變數內容

    讀取變數內容符 : $

    讀取方法 : $變數名

    A="test_name"
    echo $A
    
  • 取消變數 unset

    #unset A
    
  • 定義全域性變數 export

    #export name='test_name'
    如果希望本地變數或者全域性變數可以永久使用,可以將需要設定的變數寫入變數檔案中即可
    
  • 定義永久變數

    本地變數: 使用者私有變數,只有本使用者可以使用...

    全域性變數: 所有使用者都可以使用...

6 陣列

  • 陣列介紹

  • 基本陣列

    陣列可以讓使用者一次賦予多個值,需要讀取資料時只需通過索引呼叫就可以方便讀出.

    • 陣列語法

      陣列名稱=(元素1 元素2  元素3 ...)
      
    • 陣列讀出

      ${陣列名稱[索引]}
      
      索引預設是元素在陣列中的排隊編號,預設第一個從0開始
      
    • 陣列賦值

      • 方法1:一次賦一個值

        array_0[0]='0'
        
      • 方法2:一次賦多個值

        #array_0=(tom jack alice)
        #array_0=(`cat /etc/passwd`) --希望是將該檔案中的每一個行作為一個元素賦值給陣列array_0
        #array_0=(`ls /usr/bin`)
        
    • 檢視陣列

      #declare -a --檢視當前bash定義的陣列
      
    • 訪問陣列元素

      #echo ${array_0[0]} --訪問陣列中的第一個元素
      #echo ${array_0[@]} --訪問陣列中所有元素,等同於 echo ${array_0[*]}
      #echo ${#array_0[@]} --統計陣列元素的個數
      #echo ${!array_0[@]} --獲取陣列元素的索引
      #echo ${array_0[@]:1} --從陣列下標1開始
      #echo ${array_0[@]:1:2} --從陣列下標1開始,訪問兩個元素
      
    • 遍歷陣列

      方法一:預設陣列通過陣列元素的個數進行遍歷

      方法二:針對關聯陣列可以通過陣列元素的索引進行遍歷

  • 關聯陣列

    關聯陣列可以允許使用者自定義陣列的索引,這樣使用起來更加方便、高效.

    • 定義關聯陣列

      申明關聯陣列變數
      #declare -A ass_array_1
      #declare -A ass_array_2
      
    • 關聯陣列賦值

      方法一:一次賦一個值
      	陣列名[索引]=變數名
      	#ass_array_1[index_name]=value_name
      方法二:一次賦多個值
      	#ass_array_2=([index_name_1]=tom [index_name_2]=jack ...)
      
    • 檢視陣列

      # declare -A
      

7 shell流程控制-if判斷語句

  • shell中的運算

    • 數學比較運算

      運算子解釋:
      	-eq   等於
      	-ge   大於或等於
      	-gt   大於
      	-le   小於或等於
      	-lt   小於
      	-ne   不等於
      
      注意:
      	1.只能比較整型
      	2.遇到浮點型需要比較的,則可將其放大10倍 
      
    • 字串比較運算

      執行符解釋,注意字串別忘了使用引號引起來
      	==	等於
      	!=	不等於
      	-n	檢查字串的長度是否大於0
      	-z	檢查字串的長度是否為0
      
    • 檔案比較與檢查

      test	-d	檢查檔案是否存在且為目錄
      		-e	檢查檔案是否存在
      		-f	檢查檔案是否存在且為檔案
      		-r	檢查檔案是否存在且可讀
      		-s  檢查檔案是否存在且不為空
      		-w	檢查檔案是否存在且可寫
      		-x	檢查檔案是否存在且可執行
      		-O  檢查檔案是否存在且被當前使用者擁有
      		-G	檢查檔案是否存在並且預設組為當前使用者組
      
      		file1 -nt file2	檢查file1是否比file2新
      		file1 -ot file2 檢查file1是否比file2舊
      
    • 邏輯運算

      	邏輯與運算	&&
      	邏輯或運算	||
      	邏輯非運算	|
      
      邏輯運算注意事項:
      	邏輯與 或 運算都需要兩個或以上條件,邏輯非運算只能一個條件
      
    • 賦值運算

      	=		賦值運算子
      
  • if語法

    • 語法1: 單if語句

      適用範圍: 只需要一步判斷,條件返回真幹什麼,或者返回假幹什麼

      語句格式:

      if [condition] 	#condition 值為true or false
      	then
      		commands
      fi
      
    • 語法2: if-then-else

      適用範圍: 兩步判斷,條件為真幹什麼,條件為假幹什麼

      if [condition]
      	then 
      		commands1
      else
      		commands2
      if
      
      #!/bin/bash
      
      if [ $1 -eq $2]
      	then 
      		echo "$1 = $2"
      else
      	if [ $1 -gt $2]
      		then
      			echo "$1 > $2"
      	else
      			echo "$1 < $2"
      	fi
      fi
      
    • 語法3: if-then-elif語句

      適用範圍: 多於兩個以上的判斷結果,也就是多於一個以上的判斷條件

      if [condition 1]
      	then 
      		commands1
      elif [condition 2]
      	then 
      		commands2
      else
      		commands3
      if
      
      #!/bin/bash
      
      if [ $1 -eq $2]
      	then
      		echo "$1 = $2"
      elif [ $1 -gt $2 ]
      	then
      		echo "$1 > $2"
      else
      		echo "$1 < $2"
      fi
      
  • if高階應用

    1. 條件符號使用雙圓括號,可以在條件中植入數學表示式

      #!/bin/bash
      
      if (( 100%3+1>10 ));then
      	echo "yes"
      else
      	echo "no"
      fi
      
    2. 使用雙方括號,可以在條件中使用萬用字元

      #!/bin/bash
      
      for i in r1 rr2 cc rr3
      	do
      		if [[ $i == r* ]];then
      			echo $i
      		fi
      done
      

8 shell流程控制-for迴圈語句

  • for迴圈介紹

  • for語法

    • for 語法一

      for var in value1 value2 ......
      	do
      		commands
      done
      
      for i in `seq 1 9`
      	do 
      		echo $i
      done
      
    • for語法二

      C式的for命令
      
      for ((變數;條件;自增減運算))
      	do
      		程式碼塊
      done
      
      for ((i=1;i<10;i++))
      	do
      		echo $i
      done
      

9 迴圈控制語句

  • sleep N 指令碼執行到該步休眠N秒

  • continue跳過迴圈中的某次迴圈

    #!/bin/bash
    for ((i=1;i<10;i++))
    	do
    		if [ $i -eq 5 ];then
    			continue
    		fi
    	echo $i
    done
    
  • **break跳出迴圈繼續執行後續程式碼 **

10 shell流程控制-while迴圈語句

  • while迴圈介紹

    知道迴圈次數就可以使用for,如果不知道程式碼要迴圈多少次,就使用while

  • while迴圈語法

    while [ condition ]	#注意,條件為真while才會迴圈,條件為假,while停止迴圈
    do
    	commands
    done
    
  • while迴圈實戰

    #!/bin/bash
    read -p "login: " account
    while [ $account != 'root' ]
    	do
    		read -p "login: " account
    done
    

11 until語句

  • until介紹

    和while正好相反,until是條件為假開始執行,條件為真停止執行

  • until語法

    until [ condition ]  #注意,條件為假until才會迴圈,條件為真,until停止迴圈
    do
    	commands程式碼塊
    done
    

12 case多條件分支語句

  • case介紹

    根據不同的狀況來執行不同的預案

  • case語法

    case 變數 in
    條件1)
    	執行程式碼塊1
    ;;
    條件2)
    	執行程式碼塊2
    ;;
    ...
    esac
    
    注意:每個程式碼塊執行完畢要以;;結尾代表結束,case結尾要以倒過來寫的esac來結束
    

13 shell特殊變數

  • 特殊引數

    $0	指令碼的名字
    $*	代表所有引數,其間隔為IFS內定引數的第一個字元
    $@	與*星號類同,不同之處在於不參照IFS
    $#	代表引數數量
    $	執行上一個指令的返回值
    $- 	最近執行的foreground pipeline的選項引數
    $$	本身的Process ID
    $:	執行上一個背景的PID
    $_	顯示出最後一個執行的命令
    $N	shell的第幾個外傳引數
    

14 shell函式

  • 函式介紹

    將程式碼模組化,一個模組實現一個功能.
    
    函式的優點:
    	1.程式碼模組化,呼叫方便,節省記憶體
    	2.程式碼模組化,程式碼量少,排錯簡單
    	3.程式碼模組化,可以改變程式碼的執行順序
    
  • 函式語法

    語法一:
    
    函式名 () {
    	程式碼塊
    	return N
    }
    
    語法二:
    
    function 函式名 {
    	程式碼塊
    	return N
    }
    
  • 函式應用

    #定義一個函式
    print_str () {
    	echo "welcome to my home"
    }
    #或者
    function hello {
    	echo "hello world"
    }
    
    #呼叫
    print_str
    hello
    
    --說明
    	1.print和hello就是函式的名字,函式名字命名參考變數命名規則
    	2.定義好函式後,如果想呼叫該函式,只需通過函式名呼叫即可
    
    #!/bin/bash
    
    
    #變數區
    proc=nginx
    nginx_install_doc="/usr/local/nginx"
    nginxd="$nginx_install_doc/sbin/nginx"
    pid_file="$nginx_install_doc/logs/nginx.pid"
    
    
    
    #系統提供的函式庫
    #if [ -f /etc/init.d/functions ];then
    #    . /etc/init.d/functions
    #else
    #    echo "not found file /etc/init.d/functions"
    #    exit
    #fi
    
    
    #function 
    start() {
        # 如果nginx沒有啟動,直接啟動,否則報錯,已經啟動
        if [ -f $pid_file ];then
            # 獲取程序id
            nginx_process_id=`cat $pid_file`
            # 通過程序id查詢相關程序狀態,統計數量
            nginx_process_num=`ps aux | grep $nginx_process_id | grep -v "grep" | wc -l`
        fi
    
        #如果檔案存在且程序數量等於1,代表nginx在執行中
        if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
            echo " nginx running... "
        else
            #如果檔案存在且程序數量小於1,代表nginx未執行
            if [ -f $pid_file ]&&[ $nginx_process_num -lt 1 ];then
                #刪除程序
                rm -f $pid_file
                #啟動程序
                echo " nginx start `daemon $nginxd` "
                #另一種啟動的方式
                #action "nginx start" $nginxd
            fi
            echo " nginx start `daemon $nginxd` "
        fi
    }
    
    stop() {
        if [ -f $pid_file ]&&[ $nginx_process_num -ge 1];then
            action "nginx stop" killall -s QUIT $proc
            rm -f $pid_file
        else
            action "nginx stop" killall -s QUIT $proc 2>/dev/null
        fi
    } 
    
    restart () {
        stop
        sleep 1
        start
    }
    
    reload () {
        if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
            action "nginx reload" killall -s HUP $proc
        else
            action "nginx reload" killall -s HUP $proc 2>/dev/null
            
        fi
    }
    
    status () {
        if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
            echo "nginx running..."
        else 
            echo "nginx stop"
        fi
    }
    
    
    #callable
    case $1 in
    start) start;;
    stop) stop;;
    restart) restart;;
    reload) reload;;
    status) status;;
    *) ehco "USAGE: $0 start|stop|restart|reload|status";;
    esac
    

15 正則表示式之特殊字元

  • 正則表示式介紹

    ​ 正則表示式是一種文字模式匹配,包括普通字元(例如,a到z之間的字母)和特殊字元(稱為“元字元”).它是一種字串匹配的模式,可以用來檢查一個字串是否含有某種子串、將匹配的子串替換或者從某個字串中取出某個條件的子串.

    ​ shell支援正則表示式,但不是所有的命令都支援正則表示式,常見的命令中只有grep、sed、awk命令支援正則表示式.

  • 定位符

    定位符使用技巧:同時錨定開頭和結尾,做精準匹配;單一的錨定開頭和結尾,做模糊匹配

    定位符 說明
    ^ 錨定開頭^a 以a開頭,預設錨定一個字元
    $ 錨定結尾a$ 以a結尾,預設錨定一個字元
    egrep 等同於 grep -E
    
    
    #egrep "^ac$" file  --精確匹配file中的內容
    #egrep "^a" file --匹配file中以a開頭的內容
    
  • 匹配符:匹配字串

    匹配符 說明
    . 匹配除回車以外的任意字元
    ( ) 字串分組
    [ ] 定義字元類,匹配括號中的一個字元
    [ ^ ] 表示否定括號中出現字元類中的字元,取反
    \ 轉義字元
    | (a|b) 匹配a或b
  • 限定符:對前面的字元或者字串做限定說明

    限定符 說明
    * 某個字元之後加星號表示該字元不出現或出現多次
    ? 與星號相似,表示該字元出現一次或不出現
    + 與星號相似,表示其前面字元出現一次或多次,但必須出現一次
    {n, m} 某個字元之後出現,表示該字元最少n次,最多m次
    {m} 正好出現了m次
  • POSIX特殊字元

    特殊字元 說明
    [:alnum:] 匹配任意字母字元0-9 a-z A-Z
    [:alpha:] 匹配任意字母,大寫或小寫
    [:digit:] 數字0-9
    [:graph:] 非空字元(非空格控制字元)
    [:lower:] 小寫字元a-z
    [:upper:] 大寫字元A-Z
    [:cntrl:] 控制字元
    [:print:] 非空字元(包括空格)
    [:punct:] 標點符號
    [:blank:] 空格和TAB字元
    [:xdigit:] 16進位制數字
    [:space:] 所有空白字元(新行、空格、製表符)
    --注意
    [[]] 雙中括號的意思:第一個中括號是匹配符[],匹配中括號中的任意一個字元,第二個[]是格式 如[:digit:]
    
    #egrep "^a[[:alnum:]]c$" file
    

16 shell對檔案的操作

  • 簡介

    在shell指令碼編寫中,時常會用到對檔案的相關操作,比如增加內容,修改內容,刪除部分內容,檢視部分內容等,可以通過perl、sed等命令來實現上述功能.

  • sed命令

    • sed簡介

      sed是Linux中提供的一個外部命令,它是一個行(流)編輯器,非互動式的對檔案內容進行增刪改查的操作,使用者只能在命令列輸入編輯命令、指定檔名,然後在螢幕上檢視輸出.

      sed和文字編輯器的本質區別:
      	文字編輯器:編輯物件是檔案
      	行編輯器:編輯物件是檔案中的行
      
    • sed資料處理原理

      				   sed處理資料原理
      文字中的一行————————————>快取————————————>電腦螢幕
      		    資料在快取中處理,然後預設輸出到螢幕
      
    • sed命令

      **語法: ** sed [options] '{command}[flags]' [filename]

      --命令選項
      -e script 將指令碼中指定的命令新增到處理輸入時執行的命令中 多條件,一行中要有多個操作
      -f script 將檔案中指定的命令新增到處理輸入時執行的命令中
      -n		  抑制自動輸出
      -i		  編輯檔案內容
      -i.bak	  修改時同時建立.bak備份檔案
      -r		  使用擴充套件的正則表示式
      !		  取反, (跟在模式條件後與shell有所區別)
      
      
      --sed常用內部命令
      a	在匹配後面新增
      i	在匹配前面新增
      p	列印
      d	刪除
      s	查詢替換
      c	更改
      y	轉換  N D P
      
      --flags
      數字		  表示新文字替換的模式
      g:		 	表示用新文字替換現有文字的全部例項
      p:		 	表示列印原始的內容
      w filename: 將替換的結果寫入檔案
      
      #sed 'a\hello world' data
      #sed '3a\hello world' data
      #sed '2,4a\hello world' data
      #sed '/3 the/a\hello world' data   --前面兩個/,表示匹配模式
      

17 shell_awk基本語法

  • awk介紹

    awk是一種可以處理資料、產生格式化報表的語言.

    awk認為檔案中的每一行是一條記錄, 記錄與記錄的分隔符為換行符,每一列是一個欄位,欄位與欄位的分隔符預設是一個或多個空格或tab製表符.

    awk的工作方式是讀取資料,將每一行資料視為一條記錄(record),每條記錄以欄位分隔符分成若干欄位,然後輸出各個欄位的值.

    --awk語法
    awk [options] [BEGIN]{program}[END][file]
    
    --常用命令選項
    -F fs      指定描繪一行中資料欄位的檔案分隔符 預設為空格
    -f file    指定讀取程式的檔名
    -v var=value  定義awk程式中使用的變數和預設值
    
    --注意
    awk程式指令碼由左打括號和右大括號定義.指令碼命令必須放置在兩個大括號之間.
    
    
    --awk程式執行優先順序是
    	1.BEGIN:   在開始處理資料流之前執行,可選項
    	2.program: 如何處理資料流,必選項
    	3.END:     處理完資料流後執行,可選項
    
  • awk基本用法

    1. awk對欄位(列)的提取

      欄位提取:提取一個文字中的一列資料並列印輸出
      
      --欄位相關內建變數
      $0   表示整行文字
      $1   表示文字行中的第一個資料欄位
      $2   表示文字行中的第二個資料欄位
      $N   表示文字行中的第N個數據欄位
      $NF  表示文字行中的最後一個數據欄位
      
      #awk '{print $0}' test
      
    2. 命令選項詳解

      -F   指定欄位與欄位的分隔符
      
      當輸出的資料流欄位格式不是awk預設的欄位格式時,我們可以使用-F命令選項來重新定義資料流欄位分隔符
      
      
      #awk -F ":" '{print $1,$3,$NF}' passwd 
      
      
    3. awk對記錄(行)的提取

      記錄提取: 提取一個文字中的一行並列印輸出
      
      記錄的提取方法有兩種: 
      	a.通過行號
      	b.通過正則匹配
      
      記錄相關內建變數
      
      NR:指定行號
      
      #awk 'NR==3{print $0}' test
      
    4. awk對字串提取

      記錄和欄位的匯合點就是字串
      
      --列印test第三行的第六個欄位
      #awk 'NR==3{print $6}' test
      
    5. awk程式的優先順序

      BEGIN是優先順序最高的程式碼塊,是在執行PROGRAM之前執行的,不需要提供資料來源,因為不涉及到任何資料的處理,也不依賴與PROGRAM程式碼塊;
      PROGRAM是讓資料流幹什麼,是必選程式碼塊,也是預設程式碼塊,所以在執行時必須提供資料來源;
      END是處理完資料流後的操作,如果需要執行END程式碼塊,就必須要PROGRAM的支援,單個無法執行
      
      #awk 'BEGIN{print "hello world"}{print $0}END{print "bye world"}' test
      
  • awk高階用法

    awk是一門語言,除了可以定義變數外,還可以定義陣列,可以進行運算及流程控制

    • awk定義陣列

      陣列定義方式: 陣列名[索引]=值

      - 定義陣列array,有兩個元素,分別是100,200,列印陣列元素
      # awk 'BEGIN{array[0]=100;array[1]=200};print array[0],array[1]'
      
    • awk運算

      1.賦值運算 =
      2.比較運算 >,>=,==,<,<=,!=
      3.數學運算 +,-,*,/,%,**,++,--
      4.邏輯匹配 &&,||
      5.匹配運算 ~,!~
      
    • awk環境變數

      變數 描述
      FIELDWIDTHS 以空格分隔的數字列表,用空格定義每個資料欄位的精確寬度
      FS 輸入欄位分隔符號
      OFS 輸出欄位分隔符號
      RS 輸入記錄分隔符
      ORS 輸出記錄分隔符號
      # awk 'BEGIN{FS=":"}$1 !~ "ro"{print $0}' passwd
      
    • 流程控制

      • if判斷語句

        # awk '{
        if ($1>5)
        print $0
        else
        print $1*2 
        }' file_name 
        
        -當該語句,寫成一行時,需要加;作為分隔符 
        # awk '{if ($1<5)print $1*2;else print $1/2}' file_name
        
        
      • for迴圈語句

        # awk '{sum=0;for (i=1;i<5;i++){sum+=$i}print sum}' file_name
        
        
        # awk '{
        sum=0
        for (i=0;i<4;i++){
        	sum+=$i
        	}
        print sum
        }' file_name
        
      • while迴圈語句

        awk '{
        	sum=0
        	i=1
        	while (i<4){
        		sum+=$i
        		i++
        	}
        	print sum
        }' file_name
        
      • do...while語句

        awk '{
        	sum=0
        	i=1
        	do {
        		sum+=$i
        		i++
        	}while (sum<150)
        	print sum
        }' file_name
        
      • 迴圈控制

        break 跳出迴圈,繼續執行後續語句
        
  • awk小技巧

    - 列印test文字的行數
    # awk 'END{print NR}' file_name
    
    - 列印file_name文字最後一行內容
    # awk 'END{print $0}' file_name
    
    - 列印test文字列數
    # awk 'END{print NF}' test