Linux的文本內容檢索-處理


Linux的文本內容檢索-處理

制作人:全心全意

文本查找

  grep:搜索以文件輸入(或者是標准輸入,如果沒有指定文件名,或者給出的文件名是-的話),尋找含有與給定的模式 PATTERN相匹配的內容的行。默認情況下, grep將把含有匹配內容的行打印出來。另外,也可以使用兩個變種程序 egrep 和 fgrep 。 Egrep與 grep -E 相同。 Fgrep 與 grep -F 相同。

  用法:

    grep [選項] 模式 [文件...]

    grep [選項] [-e 模式 | -f 文件] [文件...]

      -i:忽略大小寫

      --color:匹配到的字符串高亮顯示

      -v:反向查找

      -o:僅顯示匹配到的字符串本身,不顯示行內沒有匹配到的內容

      -E:使用擴展正則表達式,可使用egrep代替

      -A:指定顯示匹配行后面多少行

      -B:指定顯示匹配行前面多少行

      -C:指定顯示匹配行前面和后面多少行

    模式:文本字符和正則表達式元字符組合而成

      注:正則的的特殊字符的含義

        .:匹配任意單個字符

        []:匹配指定范圍內的單個字符

        字符集合:

          [:digit:]:數字

          [:lower:]:小寫字母

          [:upper:]:大寫字母

          [:punct:]:標點符號

          [:space:]:空白字符

          [:alpha:]:所有字符

          [:alnum:]:所有數字和字母

        [^]:匹配指定范圍外的單個字符  

        *:表示匹配前面的字符任意次

        \?:表示匹配前面的字符0次或1次

        \{m,n\}:表示匹配前面的字符最少m次,最多n次

          \{1,\}:最少1次,多了不限

          \{0,3\}:最少0次,最多3次

        \<:其后面的任意字符必須作為單詞首部出現(單詞可以包含數字、字母)

        \>:其前面的任何字符必須作為單詞尾部出現

          \<和\>都可以使用\b代替

        ^:行首

        $:行尾

        \(\):分組,例如\(ab\)*中將ab看做一個整體,多用於后向引用,后向引用使用\1、\2分別調用

 

#查找/etc/passwd文件中包含root的行
[root@localhost ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#查找/etc/inittab文件中以數字為結尾的行
[root@localhost ~]# grep '[[:digit:]]$' /etc/inittab 
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

  

#分組的使用
#查找tt.txt文件中分組匹配到like,后面依舊是前面匹配到的內容
[root@localhost ~]# cat tt.txt 
The like is liker.
The like is lover.
[root@localhost ~]# grep '\(l..e\).*\1' tt.txt 
The like is liker.

  

流編輯器

  sed:用於過濾和轉換文本的流編輯器

  用法:sed [選項]... {地址編輯命令(腳本)} [輸入文件]...

    地址:

      起始行,結束行:1,100為第1到100行,$表示最后一行

      /模式(正則)/:匹配到的行

      /模式1/,/模式2/:第1次匹配模式1的行開始到第1次匹配模式2的行結束中間的所有行

      精確的行:5為第五行

      起始行,+N:從起始行開始向后N行

    編輯命令:

      d:刪除符合條件的行

      p:顯示符合條件的行,不使用-n,輸出效果不好

      a \string:在指定的行后面增加新行,內容為string

      i \string:在指定的行前面增加新行,內容為string

      r FILE:將指定的文件的內容添加至符合條件行的后面

      w FILE:將指定范圍內的內容另存至指定的文件中

      s/模式/string/:查找匹配模式的字符串並替換為指定的string,分隔符///可以使用其他的代替,例如###

        g:全局替換,默認只替換每行第一個

        i:忽略字符大小寫

        &:在string中表示引用模式匹配的整個串

      y/字符集1/字符集2/:將字符集1中的字符替換為字符集2中對應的字符

    -n:靜默模式,不再默認顯示模式空間內容

    -i:直接修改原文件

    -e:同時指定多個地址編輯命令(格式為sed -e 腳本 -e 腳本 -e 腳本...)

    -f FILE:文件中為腳本命令,每一行為一個腳本,然后依次使用腳本對文件進行處理

    -r:使用擴展正則表達式,默認只支持基本正則表達式

    

   工作模式:逐行讀取文本,將符合條件的文本行讀取到內存空間(模式空間),而后使用編輯命令進行編輯,將結果顯示到屏幕,默認對源文件不進行任何處理,處理的僅是模式空間讀取過來的副本

 

#sed中替換可以使用分組
[root@localhost ~]# cat 5.txt 
I like you
I love you
#將l..e中的L換成大寫
[root@localhost ~]# sed 's/l\(..e\)/L\1/' 5.txt 
I Like you
I Love you
#使用&進行引用整個串
[root@localhost ~]# sed  's/l..e/&r/' 5.txt 
I liker you
I lover you

  

[root@master tt]# cat 1.txt 
11
2
3
#使用字符轉換1.txt中的字符
[root@master tt]# sed 'y/123/abc/' 1.txt 
aa
b
c

#使用w將指定范圍內的內容寫入文件
[root@master tt]# sed -n '1,2 w output' 1.txt 
[root@master tt]# cat output 
11
2

  

報告生成器

  awk:根據輸入的信息,將所輸入的信息格式化后進行輸出。進行過一次更新,下載Linux下使用的是gawk。

  用法:

    awk [選項] ‘腳本’ 文件1,文件2...

    awk [選項] ‘模式 { 動作 }’ 文件1,文件2...

    -F:指定分隔符,默認使用空格作為分隔符,分隔后使用$1/$2/$3...調用,$0表示整行內容

    -v:定義awk變量

 

    模式:

      正則表達式,格式為/表達式/

[root@localhost ~]# awk -F: '/^r/{print $1}' /etc/passwd
root
rpc
rtkit

  

      表達式

#顯示UID為0的用戶名
[root@localhost ~]# awk -F: '$3 == 0 {print $1}' /etc/passwd
root

#第7個字段是否與模式匹配
[root@localhost ~]# awk -F: '$7~"bash$" {print $1}' /etc/passwd
root
zq

  

      指定范圍,格式為模式1,模式2,模式1開始,模式2結束,模式建議使用表達式,測試時正則出現異常

      BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次

[root@localhost ~]# awk 'BEGIN{print "開始"} {print $1,$4} END{ print "結束" }' 1.txt 
開始
My quanxinquanyi.
This text.
結束

  

      Empty(空模式):文件的每一行都做處理,模式什么也不寫,直接寫動作命令

[root@localhost ~]# awk '{print $1,$4}' 1.txt 
My quanxinquanyi.
This text.

  

    awk的內置變量

      FS:指定輸入內容的分隔符,默認是空白字符,等同於選項-F

      RS:指定輸入內容的換行符,默認是換行符

      OFS:指定輸出內容的分隔符,默認是空白字符

      ORS:指定輸出內容的換行符,默認是換行符

    awk的內置數據變量

      NR:相對於所有文件,awk命令所處理的行數

      NF:當前行的字段個數

      FNR:相對於當前處理的文件,awk命令所處理的行數,在指定多個文件時使用

    awk用戶自定義變量

      gawk允許用戶自定義自己的變量,以便在程序代碼中使用,變量名命名規則與大多數編程語言相同,只能使用字母、數字和下划線,切不能以數字開頭,gawk變量名稱區分字符大小寫。     

#用戶自定義變量
[root@localhost ~]# awk 'BEGIN{ tt="test"; print tt}'
test
#使用選項用戶自定義變量
[root@localhost ~]# awk -v tt="test" BEGIN'{print tt}'
test

  

    動作:

      print:輸出內容,多個內容使用逗號分隔

      printf:自定義格式化輸出內容,不會自動打印換行符

        用法:printf 格式 內容1,內容2...

        格式:格式之間不需要使用逗號進行分隔

          %c:顯示字符的ASCII碼

          %d,%i:十進制的整數

          %e,%E:科學計數法顯示數值

          %f:顯示浮點數

          %g,%G:以科學計數法的格式或浮點數的格式顯示數值

          %s:顯示字符串

          %u:無符號整數

          %%:顯示%號自身

        修飾符:修飾符在格式中使用,例如(%-c、%+d)

          N:顯示寬度,N為數字

          -:左對齊

          +:顯示數值符號

#以10個字符作為寬度,默認右對齊
[root@localhost ~]# awk '{printf "%10s\n",$1}' 1.txt 
        My
      This
#以10個字符作為寬度,使用左對齊
[root@localhost ~]# awk '{printf "%10-s\n",$1}' 1.txt 
My        
This
#顯示用戶名和UID,用戶名以20個字符顯示並且左對齊,UID以5個字符顯示,默認對齊
#格式之間無需使用分隔符
[root@localhost ~]# awk -F: '{printf "%-20s%5d\n",$1,$3}' /etc/passwd
root                    0
bin                     1
daemon                  2
......

      表達式

      控制語句:if、if-else、while、do-while、for、case、break和continue、next(提前結束此行的處理,進入下一行)

#判斷用戶名是否為root,root為管理員,否則為普通用戶
[root@localhost ~]# awk -F: '{if ($1=="root") print $1,"管理員";else print $1,"普通用戶"}' /etc/passwd
root 管理員
bin 普通用戶
daemon 普通用戶

  

#輸出/etc/中字段的字符個數大於等於4的字段
[root@bogon ~]# awk -F: '{i=1;while(i<=NF){if (length($i) >= 4) print $i;i++}}' /etc/passwd
root
root

  

#統計默認shell分別使用的用戶數
#awk中數組的下邊可以使用字符串,不指定值默認為1,for循環中A的值為數組的下標
[root@bogon ~]# awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd
/bin/sync 1
/bin/bash 2
/sbin/nologin 38
/sbin/halt 1
/sbin/shutdown 1

  

      輸入輸出語句

  

    awk的操作符

      算術操作符:

        **:次方

        *:乘法

        /:除法

        +:加法

        -:減法

        %:取余

      賦值操作符:

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

        注意:如果某模式為*號,此時使用/*/可能會有語法錯誤,應以/[*]/替代

      比較操作符:

        <、>、<=、>=、==、!=、

        x ~ y:x為字符串,y為模式,y模式可以匹配x為真

        x !~ y:y模式不可以匹配x為真

      邏輯關系符

        &&、||

      條件表達式

        三目運算符:條件?值1:值2

 

     awk的內置函數

      length([string]):返回string字符串中的字符個數

 

  cut:在文件的每一行中提取片斷

  用法:cut [選項] [文件]

    -d,--delimiter:指定字段分隔符,默認使用TAB鍵作為分隔符(非空格)

    -f,--fields:指定輸出的字段

[root@slave2 ~]# cat 1.txt 
123 345 456 567
#指定空格為分隔符,輸出第2個字段
[root@slave2 ~]# cut -d" " -f2 1.txt 
345
#輸出第1到3個字段
[root@slave2 ~]# cut -d" " -f1-3 1.txt 
123 345 456
#輸出第1和第4個字段
[root@slave2 ~]# cut -d" " -f1,4 1.txt 
123 567

 

文本排序

  sort:對文本文件的行進行排序,默認根據升序進行排序,標准是首個字符在ASCII碼表中的位置

  用法:sort [選項] [文件]

    -b:忽略行首的空格

    -n:按照數值大小排序,暗含-b

    -r:顛倒默認的排序,也就是降序

    -o:將排序結果輸出到指定文件

    -t:指定字段分隔符

    -k:指定排序的字段

    -u:對排序后重復的行進行去重,對應命令uniq(必須排序后使用,去重時相同的行必須相鄰

    -f:排序時忽略字符大小寫

#根據UID對文件進行數值排序
[root@slave2 ~]# sort -n -t: -k3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......

  

  uniq:刪除排序文件中的重復行,與sort結合使用(必須排序后使用,去重時相同的行必須相鄰

  用法:uniq [選項] 輸入流

    -d:僅顯示重復的行

    -D:顯示所有重復的行

    -c:顯示每一行重復的次數

[root@slave2 ~]# cat 1.txt 
123
234
123
456
456
#對重復的行進行去重
[root@slave2 ~]# sort -n 1.txt | uniq 
123
234
456
#統計排序后重復的行的次數
[root@slave2 ~]# sort -n 1.txt | uniq -c
      2 123
      1 234
      2 456
#僅顯示重復的行
[root@slave2 ~]# sort -n 1.txt | uniq -d
123
456

  

文本統計

  wc:輸出文件中的行數、單詞數、字節數

  用法:wc [選項] [輸入流]

    -l:顯示行數

    -w:顯示單詞數

    -c:顯示字節數

    -m:顯示字符個數

    -L:顯示最長的一行包含多少個字符

[root@slave2 ~]# wc /etc/passwd
  48   97 2519 /etc/passwd    
#48行    97的單詞    2519個字節

  

字符處理

  tr:轉換或刪除字符(不能指定文件,可以使用輸入重定向或管道)

  用法:tr [選項] 字符集1 [字符集2]

    -d:刪除指定字符集中的字符

#對輸入字符進行字符集對應替換
[root@slave2 ~]# echo "abc" | tr 'ab' 'AB'
ABc

  

[root@slave2 ~]# cat 1.txt 
acz
#將1.txt中小寫字母全部轉換為大寫字母
[root@slave2 ~]# tr 'a-z' 'A-Z' < 1.txt 
ACZ
#刪除輸入中指定字符集中包含的字符
[root@slave2 ~]# tr -d 'c' < 1.txt 
az

  

文本合並

  paste:合並文件各行

  用法:paste [選項] [文件]...

    -d:指定分隔符

[root@slave1 zq20191114]# cat 1.txt 
1
2
3
[root@slave1 zq20191114]# cat a.txt 
a
b
c
#合並文件
[root@slave1 zq20191114]# paste 1.txt a.txt 
1	a
2	b
3	c
#合並文件,使用:作為分隔符
[root@slave1 zq20191114]# paste -d: 1.txt a.txt 
1:a
2:b
3:c

  

 

文件分割

  split:分割文件

  用法:split [選項] 文件 輸出文件前綴

    -l:指定按行分割,不可對二進制文件使用

    -b:指定按文件大小分割

[root@slave1 tt]# cat 2.txt 
1
2
3
#指定按行分割文件,每一行分割為1個文件
[root@slave1 tt]# split -l 1 2.txt test_

[root@slave1 tt]# ll
總用量 16
-rw-r--r-- 1 root root 6 5月  21 17:35 2.txt
-rw-r--r-- 1 root root 2 5月  21 17:35 test_aa
-rw-r--r-- 1 root root 2 5月  21 17:35 test_ab
-rw-r--r-- 1 root root 2 5月  21 17:35 test_ac

#===========================

[root@master tt]# du -sh bash 
940K	bash
#指定按大小分割文件,每500K分割為1個文件
[root@master tt]# split -b 500K bash base_
[root@master tt]# ll
總用量 1880
-rw-r--r-- 1 root root 512000 5月  21 17:38 base_aa
-rw-r--r-- 1 root root 448392 5月  21 17:38 base_ab
-rwxr-xr-x 1 root root 960392 5月  21 17:38 bash

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM