[Shell]字符截取命令:cut, printf, awk, sed

-------------------------------------------------------------------------------------------html

【cut命令】docker

  cut [選項] 文件vim

    -f 列號        ( --field 提取第幾列 )bash

    -d 分隔符    ( --delimiter 按照指定分隔符分割列 )編輯器

 

  vi user.txtui

  ( 行間分隔符爲製表符Tab,cut的默認分割符是製表符 )this

    

  

  

 

  提取系統的用戶名和uid:spa

    cut -d ":" -f 1,3 /etc/passwd命令行

 

  與grep組合使用:( 假設批量添加100個普通用戶,或須要批量刪除,那麼須要提取普通用戶的名字 )設計

    useradd user1

    useradd user2

    useradd user3

   ( 全部系統用戶登陸目錄都是/sbin/nologin , 經過匹配/bin/bash 提取全部能登陸的用戶 , -v 取反選擇不匹配root的行,再用cut匹配列提取用戶名;把結果賦給變量,經過循環刪除 )

    cat /etc/passwd | grep "/bin/bash" | grep -v "root" | cut -d ":" -f 1

 

  cut命令的侷限:   

   ( 提取系統盤使用率 )

    df -h

    df -h | grep "sda3" | cut -f 5      # 只能匹配出行全部內容,由於分隔符是空格,不是Tab

    ​df -h | grep "sda3" | cut -d " " -f 5   # 沒法匹配出想要的結果,由於分割符是嚴格匹配,若是實際內容分割符有兩個空格,沒法得出正確結果

 

  建議 man cut 查看系統手冊,內容相對簡單直觀。 

 

【printf】

  printf '輸出類型輸出格式' 內容

 

  輸出類型:

      %ns:    輸出字符串。n是數字,指輸出幾個字符

      %ni:    輸出整數。n是數字,指輸出幾個數字

      %m.nf:輸出浮點數。m和n是數字,分別指輸出的整數位數和小數位數。如%8.2f表明共輸出8位數,其中2是小數,6是整數。

 

  輸出格式:

      \a   :    輸出警告聲音

      \b    :    輸出退格鍵,也就是Backspace鍵

      \f    :    清除屏幕

      \n    :    換行

      \r    :    回車,也就是Enter鍵

      \t    :    水平輸出退格鍵,也就是Tab鍵

      \v    :    垂直輸出退格鍵,也就是Tab鍵

 

  printf %s 1 2 3 4 5 6    # 把123456當成一個字符串輸出,沒有格式

 

  printf %s %s %s 1 2 3 4 5 6    # 把%s%s123456當作字符串輸出,沒有格式

 

  printf '%s ' 1 2 3 4 5 6    # 把1 2 3 4 5 6當作字符串輸出,輸出格式爲空格

 

  printf '%s\n' 1 2 3 4 5 6    # 輸出格式爲1個一行

 

  printf '%s %s %s' 1 2 3 4 5 6    # 把內容當作字符串三個爲一組輸出,1 2 34 5 6

 

  printf '%s %s %s\n' 1 2 3 4 5 6    # 輸出格式爲3個一行

 

  printf '%s' $(cat user.txt)    # 輸出文本內容爲字符串

 

  printf '%s\t %s\t %s\t %s\n' $(cat user.txt)  # 把文本內容格式化輸出

 

  建議 man printf 查看可用的輸出格式,和C的 printf 格式同樣

 

【awk】

  awk的標準輸出命令是printf,默認分割符是空格或製表符。

  ( cut 命令不能在分割符是空格的字符串中截取列,只能是 製表符 或 具體的分割符;因此能夠用 awk 替代 cut 。

 

  1. awk '條件1{動做1} 條件2{動做2} ...' 文件名

  ( 若是條件1,執行動做1;若是條件2,執行動做2 )

 

    條件(pattern):

        通常使用關係表達式做爲條件

        x > 10    判斷變量x是否大於10

        x>=10    大於等於

        x<=10    小於等於

 

    動做(Action)

      格式化輸出

        流程控制語句

  

   awk '{printf $2 "\t" $3"\n"}' user.txt

   ( 大括號前面沒有條件,直接執行命令,這裏的printf 是awk的命令,$2 提取文件第二列,$3 提取文件第三列,$0 提取全部列 )

 

   df -h | awk '{print $1 "\t" $5 "\t" $6 "\t"}'

   ( 打印三列,這裏的print是awk的命令,系統並無print命令,因此只能在awk裏使用;與printf的區別是:print會自動在行尾加換行符,而printf不會 )

 

   df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 1

     df -h | grep sda2 | awk '{print $5}' | awk -F% '{print $1}'    # awk 替代 cut 

   ( 提取系統已使用硬盤空間,能夠把結果賦給一個變量,判斷是否大於某個值,進行報警 )

     ps --ppid 109215 | awk '/[0-9]/ print $1'   # 打印子進程 id

 

  觸類旁通,查看剩餘內存不包含單位M:free -h | grep Mem | awk '{print $4}' | cut -d 'M' -f 1 

  移除全部 image:docker rmi -f `docker images | grep MB | awk '{print $3}' | xargs`

  grep 取行,awk 按條件取指定列,cut 按分隔符取指定列。

 

  2. BEGIN:先執行一條多餘的動做

   awk 'BEGIN{print "this is a text"} {print $2 "\t" $3}' user.txt

 

  3. END:用於在全部命令處理完以後執行

  4. FS內置變量:用於定義分割符,若是須要手工定義分割符,必定要在分割符前面加BEGIN;

   awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 "\t" $3}' /etc/passwd     # 等同下面 -F 參數定義分隔符

     awk -F: 'END{print "this is end text"} {print $1 "\t" $3}' /etc/passwd      

 

  理解語言思路,在命令行中要進行這麼多功能,怎樣合理的安排就怎樣設計,這樣看來語法是很簡潔的。

  BEGIN、END也是條件。

 

  5. 關係運算符:

   cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 "\n"}'

   ( user.txt中不包含ID這行,提取知足條件爲第四列值大於18的第二列 )

 

【sed】

  sed是一種幾乎包括在全部Unix平臺的輕量級流編輯器(stream editor)。

  sed主要是用來將數據進行選取、替換、刪除、新增的命令。(能夠放在管道符以後處理)

 

  sed [選項] '[動做]' 文件名

    sed命令有兩種形式:sed [options] 'command' file(s);sed [options] -f scriptfile file(s)

  

  選項:

      -n    :    通常sed命令會把全部數據都輸出到屏幕;若是加入此選項,則只會把通過sed命令處理的行輸出到屏幕。

      sed -n '2p' user.txt    # 輸出第二行

 

      -e    :    容許對輸入數據應用多條sed命令編輯

    -f    :  添加腳本文件的內容到執行的動做

      -i    :    用sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出

 

  動做:(要加雙引號)

      a\    :    追加,在當前行後添加一行或多行。添加多行時,除最後一行外,每行末尾須要用"\"表明數據未完結。

      c\    :    行替換,用c後面的字符串替換原數據行,替換多行時,除最後一行外,每行末尾須要用"\"表明數據未完結。

      i\    :    插入,在當前行前插入一行或多行。插入多行時,除最後一行外,每行末尾須要用"\"表明數據未完結。

      d    :    刪除,刪除指定的行。

      p    :    打印,輸出指定的行。

      s    :    字串替換,用一個字符串替換另一個字符串。格式爲「行範圍s/舊字串/新字串/g」(和vim中的替換格式相似)

 

  sed -n '2p' user.txt        # 輸出第二行, p通常都要和-n使用,不加-n會顯示出全部的行

  df -h | sed -n '2p'          # 管道符結果做爲操做內容

 

  sed '2,4d' user.txt        # 刪除文件的第2行到第4行,顯示剩下的行,沒有加 i 選項,不會更改文件內容

 

  sed '2a hello' user.txt      # 在第二行後追加hello,僅僅修改命令輸出

 

  sed '2i hello \

    world' user.txt        # 在第二行前插入兩行數據,僅僅修改命令輸出

 

  sed '2c No person' user.txt    # 把第二行替換爲No person

 

  sed '2s/M/F/g' user.txt      # 把第二行的M替換爲F後輸出

  

  sed -i '2s/M/F/g' user.txt  # 把替換後的結果寫入文件

 

  sed -e 's/zhang//g ; s/wang//g' user.txt    # -e容許多條命令順序執行,用分號隔開,s前面不加數字表示全部行

 

Link: http://www.cnblogs.com/farwish/p/4806018.html

相關文章
相關標籤/搜索