文本處理工具及正則表達式

一、*各種文本處理工具

1.1抽取文本的工具

1.1.1 cat、less查看文本內容

   more、lesscat 【選項 【文件

cat  –n ,-d列行 ,-A顯示所有看不見的符號控制符),

    -E:顯示結尾$ ;-s:壓縮連續空行為一行

more  –d顯示翻頁及退出提示

less:一頁一頁查看文件或標準輸出

   /文本:搜索文本   n/N跳到下一個 上一個匹配

1.1.2 head、tail文件截取

    headtail  【選項 【文件

  head –c #指定獲取前#個字節  ;  -n #;-#:指定獲取前#

    tail –c #:指定獲取#字節  ; -n #;-#:指定獲取后#

      -f:跟蹤顯示文件新追加的內容。常用于日志監控

例如:tail –n0 –f f2 &  后臺顯示跟蹤日志  fg 1打斷

1.1.3 cut、paste按列抽取

    cut paste 合并文件:【選項 【文件

   cut  -d指明分隔符,默認為tab;常與-f一起使用;-c按字符切割

-f #:第#個字段; f #,#:離散的多個字段,例如1,3,6

-f #-#:連續的多個字段,例如1-5  ;混合使用:1-3,7

    paste:合并兩個文件同行的列到一行

-d指明分隔符,默認為tab -s所有行合成為一行顯示

    paste  f1  f2   ;paste  –s  f1  f2

1.1.4 wc、sort分析文本的工具

    wc、sort 、diffpatch

文本數據統計:

    wc  -l:統計行  ; -w:統計單詞總數  ;-c:統計字節數

文本排序:sort 【選項 files

   sort  -r執行反方向由上至下整理  -n:執行按數字大小整理

  -f:忽略字符中的字符大小寫      -u:刪除輸出中的重復行

  -t c:選項用c作為字符界定符  -k Xc字符分隔的X列整理  常用-t -k 一起使用排序

1.1.5 uniq文本壓縮工具

   uniq  選項】 file

uniq –c:顯示每行重復出現的次數 ;  -d:僅顯示重復過的行

-u:僅顯示不重復的行   :連續且完全相同的方為重復。

    常與sort命令一起使用 sort userlist.txt | uniq -c

1.1.6 diff、patch比較文件的區別

例如 $  diff  foo.conf-broken  foo.conf-works

      輸出結果為:5c5  :第5有改變

   <  use_widgets =no    ;  >  use_widgets =yes

   diff命令的輸出被保存在一種叫做補丁文件中;使用

diff  -u:輸出統一的(unified”diff格式文件,最適用于補丁文件。

patch 命令復制在其他文件中進行的改變(要謹慎使用!)

patch  -d:自動備份改變了的文件 

例如: $ diff  u  foo.conf-broken  foo.conf-works > foo.patch

       $ patch  -b  foo.conf-broken  foo.patch

reset:重置,重生成

二、Linux文本處理三劍客

   grep、sed、awk

sedstream editor,文本編輯工具

awkLinux上的實現gawk,文本報告生成器

grep:文本過濾模式:pattern工具

2.1 grep文本過濾工具

       grep:Grobal search Regular expression and Print out the line

   作用:文本搜索工具,根據用戶指定的模式對目標文件逐行進行匹配檢查;打印匹配到行:

grep 【選項pattern file

-n搜索并顯示所在文本內容的行號;   -o只顯示匹配到的字符;  i忽略字符的大小寫

-v只顯示不能被pattern匹配的行;   e:表示或者,實現多個邏輯關系如grep –e “cat” –e “ls” file

-c計算查找字符串的次數;    A #after,后#  ;-B #before,#  ;-Ccontext,前后#

REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符不代表字符表面的意義,而表示控制       

         通配的功能;程序支持:grep、vim、less、nginx

正則表達式引擎man 7 regex

     采用不同的算法,檢查出路正則表達式的軟件模塊PCREPerl Compatible Regular Expressions

元字符分類:字符匹配、匹配次數、位置錨定、分組 

2.1.1字符匹配(文本內容)                     

.匹配任意單個字符                     []匹配指定范圍內的任意單個字符         

[^]匹配指定范圍外的任意單個字符       [^/]+/?$取基名

2.1.2匹配多次

*匹配符號*前面字符任意次,包括0次   .*:匹配任意長度的任意字符,不包括:等特殊符號

\?:匹配前面的字符0或者1次          \+:匹配前面的字符至少1

           gooo*gle 相當于 goo\+gle

\{n\}:匹配前面的字符n                 \{m,n\}:匹配前面的字符【m,n

\{1,\}相當于\+

2.1.3位置錨定

^行首錨定(開頭的行)     $行尾錨定(結尾的行)    ^$空行   ^[[:space:]]*$空白行

\<單詞限定詞首;          \>單詞限定詞尾            \<pattern\>匹配整個單詞

分組:\(\)一個或多個字符捆綁在一起

分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …

\1:  從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符

實例: \(string1\+\(string2\)*\)   (\1|\2 )       \1: string1\+\(string2\)*       \2: string2

    后向引用:引用前面的分組括號中的模式所匹配字符  : \(r..t).*\(r..t\)  \(r..t).*\1   不同的

字母字符串后面如果有數字和下劃線那就錨定不了

轉義:\. 表示.字符,而不是代表任意字符

三、*正則表達式

 

文本處理工具及正則表達式

egrep及擴展的正則表達式 ;grep功能差不多,就是正則表達式少了\。

或者 a|ba或者b   ;  C|cat C或者cat    C|catCat或者cat

3.1 文件名通配符

*匹配零個或多個字符 ;  ?匹配任何單個字符;  ~當前用戶家目錄; ~mage用戶mage 家目錄

~+ 當前工作目錄  ~—: 前一個工作目錄

[0-9] 匹配數字范圍;  [a-z] :字母;   [A-Z] :字母 ;   [wang] 匹配列表中的任何的一個字符

v [^wang]  匹配列表中的所有字符以外的字符

預定義的字符類:#man 7 glob)幫助文件

[:digit:] :任意數字,相當于0-9    [:lower:] :任意小寫字母

[:upper:]:  任意大寫字母         ;  [:alpha:]:  任意大小寫字母

[:alnum:] :任意數字 或字    ;  [:blank:] :水平空白字符    ;  [:space:]水平或垂直的空白字符

四、*sed 行編輯器

sed介紹、sed用法、sed高級用法

stream EDitor,  行編輯器 ,自帶一些編程語言 ,可以直接對文件修改,故一般用管道傳遞給sed

v   sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed 主要用來自動編輯一個或多個文件, 簡化對文件的反復操作, 編寫轉換程序等。

用法:sed  [option] …  'script'  inputfile…  支持正則表達式

4.1常用選項

-n :不輸出模式空間內容到屏幕,即不自動打印  ;  -e:  多點編輯;多次編輯

-f / PATH/SCRIPT_FILE :  從指定文件中讀取編輯腳本

-r:  支持使用擴展正則表達式  ;  -i:  原處編輯,直接修改建議-i.bak,先備份.bak后 (顯示修改的內容,修改                                                                                            前的內容在file.bak中)

4.2 script ' 地址命令'

  地址定界: (一般加上-n,要不然顯示2遍)

(1)  不給地址:對全文進行處理

(2)  單地址:  #:  指定的行    ;    /pattern/ :被此處模式所能夠匹配到的每一行

(3)  地址范圍:

    #1,#2:從第#1行到#2行  ;  #,+#    ;  /pat1/,/pat2/:匹配到part1part2之間的行顯示

    #,/pat1/ :匹配第#行到匹配part之間行的顯示

    ~ :步進  1~2  顯示奇數行    2~2   顯示偶數行

4.3 編輯命令

    script  地址定界用在script

   d:  刪除模式空間匹配的行;   例如:  d刪除有空格的行 ,也可以用全局替換

   p:  顯示模式空間中的內容 , -n ‘10P’:僅顯示第10行,相當于head -10|tail -1;

         (沒有-n的話,模式空間所有的文本都顯示,10行出現2次);

a [\]text :在指定行 后面追加文本  \n,可以追加兩行至幾行 ;支持 使用\n 實現多行追加  

   cat -n /etc/passwd | sed 10a\wwwww\nrrrrrr 顯示/ect/passwd文本,并在第10行后面插入wwwww  兩行

i [\]text :在行前面 插入文本          ;與上述差不多不過是第10行行前插入。           rrrrr

c [\]text :替換行為單行或多行文本     ;與上述差不多不過是替換第10行插入。

         w  /path/somefile:  保存模式匹配的行至指定文件

     cat -n /etc/passwd | sed 10,15w  f2顯示/etc/passwd內容,但是把10-15行的內容寫到f2中去。

 r /path/somefile :讀取指定文件的文本至模式空間中匹配到的行后面

 cat -n /etc/passwd | sed ‘10,15r  f2顯示/etc/passwd內容,并在10-15行每一行后面插入顯示f2的內容。

cat -n /etc/passwd | sed  -n ‘1015r  f2,僅顯示/etc/passwd文本10-15行每行后面插入顯示f2的文本內容。

   =:  為模式空間中的行打印行號  ; cat f1 |sed -n '/root/=' 僅顯示f1文本中含有root的行號

                            cat f1 |sed  '/root/='  顯示f1文本內容 ,并在root所在行上面顯示行號

  !: 模式空間中匹配行取反處理    ;cat f1 |sed -n '/root/!=' 僅顯示f1文本中不含有root的行號

  cat f1 |sed  '/root/!='  顯示f1不含有root行的文本內容 ,并在顯示的所在行上面顯示行號

4.4 查找替換

   s/// :查找替換, 支持使用其它分隔符,s@@@ ,s###  (不支持編輯命令)

  cat  /etc/passwd | sed  s/root/ROOT/:把/etc/passwd文本中每一行第一個匹配到的root 替換為ROOT

v  替換標記:  g:  行內全局替換  ;p:  顯示替換成功的行

   w  /PATH/TO/SOMEFILE :將替換成功的行保存至文件中

4.5 sed普通命令示例

  sed 2p/etc/passwd    顯示/etc/passwd 所有內容,并再打印第二行顯示

vsed n 2p/etc/passwd   僅顯示/etc/passwd 文本第2行的內容

vsed n 1,4p/etc/passwd   僅顯示/etc/passwd 文本第1-4行的內容

vsed n /root/p/etc/passwd  僅顯示/etc/passwd 文本含有root行的內容

vsed n 2,/root/p/etc/passwd  僅顯示/etc/passwd 文本從第2 行隨后第一個匹配到root的行

vsed  -n /^$/=file               僅顯示file文本空行行號

vsed n e /^$/p’ –e /^$/=file  僅顯示空白行和空白行號

vsed /root/a\superman/etc/passwd 行后  在/etc/passwd文本含有root的行行后顯示superman

vsed /root/i\superman/etc/passwd  行前   在/etc/passwd文本含有root的行行后顯示superman

vsed /root/c\superman/etc/passwd  代替行   在/etc/passwd文本含有root的行替換為superman

vsed /^$/dfile     顯示file中的非空白行

vsed 1,10dfile    顯示file文本中除1-10行的所有的行

vnl  /etc/passwd | sed 2,5d’  顯示/etc/passwd文本中除2-5行外所有的行和行號

vnl  /etc/passwd | sed 2a tea’  顯示/etc/passwd文本中所有行號及文本,并在第2行后插入tea

vsed  's/test/mytest/g'  file       替換file文本中testmytest

sed -ns/root/&superman/p/etc/passwd 單詞后:僅顯示/etc/passwd文本中root的行并把root替換為rootsuperman

sed -n s/root/superman&/p/etc/passwd 單詞前:僅顯示/etc/passwd文本中root的行并把root替換為supermanroot

vsed  -es/dog/cat/-e s/hi/lo/pets  pets文本每一行第一個匹配的dog換成cat hi換成lo

vsed  -i.baks/dog/cat/gpets   備份pets文本為pets.bak,并把pets文本中dog全部替換成cat顯示出來

4.6 sed 工具   

v  高級編輯命令:(模式空間,保持空間)

h:  把模式空間中的內容覆蓋至保持空間中

H :把模式空間中的內容追加至保持空間中

g:  從保持空間取出數據覆蓋至模式空間

G :從保持空間取出內容追加至模式空間

x:  把模式空間中的內容與保持空間中的內容進行互換

n:  讀取匹配到的行的下一行 覆蓋 至模式空間

N :讀取匹配 到的行的 下一行 追加 至 模式空間

d:  刪除模式空間中的行

D :刪除 當前模式空間開端至\n 的內容 ( 不再傳 至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

4.7 sed高級編輯命令示例

v sed -n 'n;p' FILE  僅顯示file的偶數行

v sed '1!G;h;$!d' FILE  file文本倒敘顯示 相當于tac file

v sed '$!N;$!D' FILE  顯示file文本最后2行 相當于tail -2

v sed '$!d' FILE  僅顯示file文本最后1行 相當于tail -1

v sed GFILE  保持模式先為空的 ;追加到模式空間 ;就會形成模式空間每行之間有空格,再顯示出來

v sed gFILE   保持模式先為空的 ;覆蓋模式空間 ;就會形成模式空間都為空格,再顯示出來一片空白

v sed /^$/d;GFILE 顯示除空格之外的偶數行

v sed 'n;d' FILE  僅顯示奇數行

原創文章,作者:lyx,如若轉載,請注明出處:http://www.www58058.com/60550

(0)
lyxlyx
上一篇 2016-11-23 20:30
下一篇 2016-11-23 20:53

相關推薦

  • 啟動流程排錯,自制linux內核,編譯內核

    CentOS 6啟動流程: POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs–> switchroot–> /sbin/init–>(/et…

    Linux干貨 2016-09-20
  • 安裝配置NFS服務和掛載(Centos7)

    NFS簡介 NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位于遠端NFS服務器上的文件,就像訪問本地文件一樣。 RPC(NFS服務需要依賴RPC服務,這個比較重要) 要想了解NFS,必然要提到R…

    Linux干貨 2017-04-21
  • 第一天課程內容

    一 連接VNC 主機名:172.20.0.100 二 課堂資源下載 ftp://172.16.0.1 三 博客作業 ??? 優秀示例 www.yulongjun.com ??? 博客地址 www.www58058.com ??? 作業要求 1.每周一篇或更多,整理當周內容。 2.老師周五發鏈接地址,提交博客鏈接。 四 職業發展線路 運維 > Pytho…

    Linux干貨 2018-03-26
  • $@與$*的不同之處

    $@與$*的不同之處 $*: 把我們傳遞給腳本的參數全部合為一個字節,當成一個字符串或者參數來使用。 $@: 把我們傳遞給腳本的所有參數,每個參數都為獨立字符串,當我們用 \((n) 來調用的時候, 輸入參數的位置為第幾個,那我們就用用\)n來調用第幾個,一對應。 下面我們用代碼來看一下這兩個的區別: 創建一個簡單的腳本讓他輸出我們輸入的多個參數:&#822…

    2017-06-06
  • 搭建LAMP+NFS(附加mysql共享NFS目錄練習總結)

    練習一 環境布局: 主機6 route A (10.1.32.14)作為DNS服務器 主機centos 7 class (10.1.32.3)作為Apache,PHP(模塊方式)服務器1(有discuz程序) 主機centos 7 server (10.1.32.13)作為Apache,php(模塊方式)服務器2(無discuz) 主機centos 6 cl…

    系統運維 2016-10-25
  • Linux獲取幫助的途徑、history命令及文件系統結構

        在學習Linux的過程中,往往會遇到一些難以理解的問,這時我們就需要尋求幫助,下面是獲取幫助的幾個途徑。 一、man(manual)手冊(命令) 1、man手冊介紹 (1)man手冊是系統自帶的聯機幫助手冊,善于利用man命令,可以幫我們解決遇到的大部分問題。 (2)man手冊分為九個章節,每個章節是獨立的。 章節1:表…

    Linux干貨 2016-07-29
欧美性久久久久