Linux命令(6)

正則表達式基礎

sed中關於pattern space和hold space的小實例一則
http://www.cnblogs.com/aidysun/archive/2013/02/21/2921293.html

正則表達式

正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。  

基本語法

一個正則表達式通常被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串.
  • 語法(部分)

圖片描述

  • 優先級

    圖片描述

grep模式匹配命令

  • 基本操作
    grep命令用於打印輸出文本中匹配的模式串,它使用正則表達式作爲模式匹配的條件。grep支持三種正則表達式引擎,分別用三個參數指定:
    參數說明
    -E POSIX擴展正則表達式,ERE
    -G POSIX基本正則表達式,BRE
    -P Perl正則表達式,PCRE
    常用參數

    圖片描述

  • 使用正則表達式

    • 位置:查找/etc/group文件中以”shiyanlou”爲開頭的行
      grep ‘shiyanlou’ /etc/group
      grep ‘^shiyanlou’ /etc/group
    • 數量:將匹配以’z’開頭以’o’結尾的所有字符串
      $ echo ‘zero\nzo\nzoo’ | grep ‘z.*o’
    • 數量:將匹配以’z’開頭以’o’結尾,中間包含一個任意字符的字符串
      echo ‘zero\nzo\nzoo’ | grep ‘z.o’
    • 數量:將匹配以’z’開頭,以任意多個’o’結尾的字符串
      echo ‘zero\nzo\nzoo’ | grep ‘zo*’
    • 選擇:grep默認是區分大小寫的,這裏將匹配所有的小寫字母
      echo ‘1234\nabcd’ | grep ‘[a-z]’
    • 選擇:將匹配所有的數字
      echo ‘1234\nabcd’ | grep ‘[0-9]’
    • 選擇:將匹配所有的數字
      echo ‘1234\nabcd’ | grep ‘[[:digit:]]’
    • 選擇:將匹配所有的小寫字母
      echo ‘1234\nabcd’ | grep ‘[[:lower:]]’
    • 選擇:將匹配所有的大寫字母
      echo ‘1234\nabcd’ | grep ‘[[:upper:]]’
    • 選擇: 將匹配所有的字母和數字,包括0-9,a-z,A-Z
      echo ‘1234\nabcd’ | grep ‘[[:alnum:]]’
    • 選擇:將匹配所有的字母
      echo ‘1234\nabcd’ | grep ‘[[:alpha:]]’
      完整的特殊符號及說明

      圖片描述

    • 排除字符
      echo ‘geek|good’ | grep ‘[^o]’
      注意:當^放到中括號內爲排除字符,否則表示行首。

sed 流編輯器

sed工具在 man 手冊裏面的全名爲"sed - stream editor for filtering and transforming text ",意即,用於過濾和轉換文本的流編輯器。在 Linux/UNIX 的世界裏敢稱爲編輯器的工具,大都非等閒之輩,比如前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。sed與上述的最大不同之處大於它是一個非交互式的編輯器,下面我們就開始介紹sed這個編輯器.
  • sed 命令基本格式
    sed [參數]… [執行命令] [輸入文件]…
    形如:
    sed -i ‘1s/sad/happy/’ test # 表示將test文件中第一行的”sad”替換爲”happy”

    圖片描述

  • sed編輯器的執行命令(這裏”執行“解釋爲名詞)
    [n1][,n2]command
    [n1][~step]command
    其中一些命令可以在後面加上作用範圍,形如:
    sed -i ‘s/sad/happy/g’ test # g表示全局範圍
    sed -i ‘s/sad/happy/4’ test # 4表示指定行中的第四個匹配字符串
    其中n1,n2表示輸入內容的行號,它們之間爲,逗號則表示從n1到n2行,如果爲~波浪號則表示從n1開始以step爲步進的所有行;command爲執行動作。

  • 常用動作指令:

    圖片描述

  • sed操作舉例

    • 我們先找一個用於練習的文本文件:
      cp /etc/passwd ~
    • 打印指定行
    • 打印2-5行
      nl passwd | sed -n ‘2,5p’
    • 打印奇數行
      nl passwd | sed -n ‘1~2p’
    • 行內替換
    • 將輸入文本中”shiyanlou” 全局替換爲”hehe”,並只打印替換的那一行,注意這裏不能省略最後的”p”命令
      sed -n ‘s/shiyanlou/hehe/gp’ passwd
      注意: 行內替換可以結合正則表達式使用。
    • 行間替換
      nl passwd | grep “shiyanlou”
    • 刪除第21行
      sed -n ‘21c\www.shiyanlou.com’ passwd

awk文本處理語言

AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。它允許您創建簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。最簡單地說,AWK是一種用於處理文本的編程語言工具。
  • awk的一些基礎概念
    awk所有的操作都是基於pattern(模式)—action(動作)對來完成的,如下面的形式:
    pattern {action}

    你可以看到就如同很多編程語言一樣,它將所有的動作操作用一對{}花括號包圍起來。其中pattern通常是是表示用於匹配輸入的文本的“關係式”或“正則表達式”,action則是表示匹配後將執行的動作。在一個完整awk操作中,這兩者可以只有其中一個,如果沒有pattern則默認匹配輸入的全部文本,如果沒有action則默認爲打印匹配內容到屏幕。awk處理文本的方式,是將文本分割成一些“字段”,然後再對這些字段進行處理,默認情況下,awk以空格作爲一個字段的分割符,不過這不是固定了,你可以任意指定分隔符,下面將告訴你如何做到這一點。
    
  • awk命令基本格式
    awk [-F fs] [-v var=value] [-f prog-file | ‘program text’] [file…]
    • -F:用於預先指定前面提到的字段分隔符(還有其他指定字段的方式)
    • -v用於預先爲awk程序指定變量
    • -f用於指定awk命令要執行的程序文件,或者在不加-f參數的情況下直 接將程序語句放在這裏
    • 最後爲awk需要處理的文本輸入,且可以同時輸入多個文本文件
  • awk操作
    • 先用vim新建一個文本文檔
      vim test
      包含如下內容:
      I like linux
      www.shiyanlou.com
    • 使用awk將文本內容打印到終端
"quote>" 不用輸入**   
awk '{   
print 
 }' test
  • 或者寫到一行
awk '{print}' test
  • 將test的第一行的每個字段單獨顯示爲一行
> if(NR==1){   
> print $1 "\n" $2 "\n" $3**   
> } else {   
> print}   
> }' test
  • 或者
awk '{   
> if(NR==1){   
> OFS="\n"   
> print $1, $2, $3   
> } else {   
> print}   
> }' test
     說明:你首先應該注意的是,這裏我使用了awk語言的分支選擇語句if,它的使用和很多高級語言如C/C++語言基本一致,如果你有這些語言的基礎,這裏將很好理解。另一個你需要注意的是NR與OFS,這兩個是awk內建的變量,NR表示當前讀入的記錄數,你可以簡單的理解爲當前處理的行數,OFS表示輸出時的字段分隔符,默認爲" "空格,如上圖所見,我們將字段分隔符設置爲\n換行符,所以第一行原本以空格爲字段分隔的內容就分別輸出到單獨一行了。然後是$N其中N爲相應的字段號,這也是awk的內建變量,它表示引用相應的字段,因爲我們這裏第一行只有三個字段,所以只引用到了$3。除此之外另一個這裏沒有出現的$0,它表示引用當前記錄(當前行)的全部內容。
  • awk常用的內置變量

    圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章