1. 程式人生 > >文字處理工具 grep awk sed完全解讀

文字處理工具 grep awk sed完全解讀

文字處理工具 grep awk sed完全解讀

正則表示式單字元

  • 1特定字元 : 某個具體的字元 'a'
  • 2範圍內字元 : [a-zA-Z]
  • 3任意字元 : . // grep . file // 如果點放到中括號中[.] 或者用反斜槓'\.' 則它不代表任意一個字元,而代表它本身 例如 grep '\.' file
  • 4反向字元 [^a-z] [^0]

正則表示式其他符號

  • 邊界字元 : 頭字元 ^ : ^root 注意與 [^] 的區別
  • 邊界字元 : 尾字元 $ : false$ 空行表示為 ^$
  • 元字元 :
    \w 代表著普通字元或者特殊字元 匹配任何字類字元,包括下劃線 [A-Za-z0-9_]
    \W 代表任何非字類字元 [^A-Za-z0-9_]
    \b 單詞的分割 grep '\bx\b' passwd 為 x為單獨單詞的資料

正則表示式字元組合

  • 字串 : 'root' '1000' 'm..c' m開頭c結束長度為4的字串 '[A-Z][a-z]' '\b[0-9][0-9]\b' 兩位數
  1. 重複
  2. 邏輯

重複

  1. * : 0次或多次 匹配前面的字元或表示式 grep 'se*' passed
  2. + : 1次或多次 匹配前面的字元或表示式 grep 'se\+' passed + 號 出現在字串中時代表它本身,如果作為重複表示式使用時必須加上\
  3. ? : 0次或一次 匹配前面的字元或表示式 grep 'se\?' ? 作為重複表示式使用必須加上\ 同上加號
  4. {n,m} :重複指定次數 {0,} 注意 大括號需要進行轉義

上面是對單個字元的重複,如果對字串的重複可以使用() 其中,括號使用在字串中時加上\
(se)* 如 : grep '\(se\)*' passwd
(se)+ 如 : grep '\(se\)\+' passwd
(se)? 如 : grep '\(se\)\?' passwd
(se){2,3} 如 : grep '\(se\)\{2,3\}' passwd

任意字元表示式 : .

任意的字串 '.*'
grep '^r.*' passwd
'm.*c' 'm..c' '\bm.*c\b' '\bm[a-z]*c\b'

邏輯的表示

| : grep 'bin/\(false\|true\)' passwd () 和 | 在正則表示式中不能單獨出現,必須加上\ 反斜槓

正則表示式案例


匹配4-10位qq號

grep '^[0-9]\{4.10\}$' qq.txt

匹配15位或18位身份證號 (支援帶X的)

grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' qq.txt

匹配密碼 (由數字 26個字母和下劃線組成)

grep '^\w\+' qq.txt

正則表示式中符號必須轉義的有

| () {} + ?

正則總結

正則練習

  • grep OR操作:
    1. grep 'pattern1|pattern2' filename
    2. grep -E 'pattern1|pattern2' filename
    3. grep -e 'pattern1' -e 'pattern2' filename
    4. egrep 'pattern1|pattern2' filename
  • grep AND 操作:
    1. grep -E 'pattern1.*pattern2' filename
    2. grep -E 'pattern1' | grep -E 'pattern2'
  • grep NOT 操作
    1. grep -v 'pattern1' filename
[root@vm1 opt]# cat employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000

OR

[root@vm1 opt]# grep 'Tech\|Manager' employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# grep -E 'Tech|Manager' employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# egrep 'Tech|Manager' employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# grep -e 'Tech' -e 'Manager' employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# 

AND

[root@vm1 opt]# grep -E 'Manager.*Sales' employee.txt 
100  Thomas  Manager    Sales       $5,000  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# grep -E 'Manager.*Sales|Sales.*Manager' employee.txt 
100  Thomas  Manager    Sales       $5,000  
500  Randy   Manager    Sales       $6,000  
[root@vm1 opt]# grep 'Manager' employee.txt | grep 'Sales'
100  Thomas  Manager    Sales       $5,000  
500  Randy   Manager    Sales       $6,000 

NOT
grep -v

sed命令 —— 流處理編輯器

sed是行處理工具: 一次處理一行並且不改變文字內容的(除非重定向)
sed的處理過程: 正則選定文字 -> sed進行處理

sed的格式

  • 命令列格式:sed [options] 'command' file(s)
  • 指令碼格式:sed -f scriptfile file(s) 命令列格式:
    options(引數) : -e , -n
    command(動作) : 行定位(正則) + sed命令(操作)
    -p (列印相關行 記得跟-n配合,否則會多次列印 ) sed -n 'p' passwd

sed —— 行定位

定位一行: x ; /pattern/

列印第十行: sed -n '10p' passwd (可以使用nl passwd | sed -n '10p' 驗證 ) 列印abrt行: sed -n '/abrt/p' passwd

定位幾行:x,y ; /pattern/,y ; /pattern1/,/pattern2/ ; x,y!

列印10到20行 : nl passwd | sed -n '10,20p'
列印news所在行和mail所在行之間的行 : nl passwd | sed -n '/news/,/mail/p'
不列印news所在行和mooc所在行之間的行 : nl passwd | sed -n '/uucp/,/rpc/!p'

間隔行定位:first~step

[[email protected] ~]$ nl passwd | sed -n '1,2p'  -- 靜默輸出
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
[[email protected] ~]$ nl passwd | sed '1,2p'     -- 全量+操作行輸出(p)     
     1  root:x:0:0:root:/root:/bin/bash
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
     .......
[[email protected] ~]$ nl passwd | sed -n '1~3p'  -- 間隔行定位
     1  root:x:0:0:root:/root:/bin/bash
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    10  operator:x:11:0:operator:/root:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    19  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    22  gluster:x:997:995:GlusterFS daemons:/var/run/gluster:/sbin/nologin
    25  tjdep:x:30101:1001:tujia deploy user:/home/tjdep:/bin/bash
    28  centos:x:50003:50003:Cloud User:/home/centos:/bin/bash

sed 引數

  • -e或--expression 以選項中指定的script來處理輸入的文字檔案。
  • -n或--quiet或--silent 僅顯示script處理後的結果。 sed 操作命令
  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!(全量替換,不是每行替換)
  • d :刪除,因為是刪除啊,所以 d 後面通常不接任何;
  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行~
[[email protected] ~]$ nl passwd | sed -e '1,2a \ zhangsan'
     1  root:x:0:0:root:/root:/bin/bash
 zhangsan
     2  bin:x:1:1:bin:/bin:/sbin/nologin
 zhangsan
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
-- '\' 為操作命令和額外引數的間隔符 例如行前加空格對其的情況
[[email protected] ~]$ nl passwd | sed -e '1,2a \     zhangsan'  
     1  root:x:0:0:root:/root:/bin/bash
     zhangsan
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     zhangsan
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[[email protected] ~]$ nl passwd | sed -e '1,3d'
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]$ nl passwd | sed -e '1,2a \
     zhangsan'
     1  root:x:0:0:root:/root:/bin/bash
     zhangsan
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     zhangsan
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[[email protected]$ nl passwd | sed  -e '2,5c \     zhangsan'   -- 整段替換
     1  root:x:0:0:root:/root:/bin/bash
     zhangsan
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]$ nl passwd | sed -e '/root/d'    -- 正則匹配刪除
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-- 刪除空行展示
[[email protected]$ sed '/^$/d' 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

字串替換:s g (g全量替換)

sed 's/要被取代的字串正則/新的字串/g'

如要輸出日誌檔案錯誤的IP部分:

[[email protected] /home/tomcat/logs]$ grep -iE 'ERROR' info
2018-12-08 00:13:53.113 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[66.225.251.170] loc failed
2018-12-08 00:17:42.551 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[172.105.240.169] loc failed
2018-12-08 00:32:47.807 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[171.97.148.2] loc failed
2018-12-08 00:35:18.650 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[122.155.45.101] loc failed
2018-12-08 00:36:21.390 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[95.134.248.53] loc failed
2018-12-08 00:38:27.578 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[27.1.208.41] loc failed
2018-12-08 00:46:38.847 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[182.68.246.99] loc failed
2018-12-08 00:47:22.042 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[65.74.21.178] loc failed
2018-12-08 00:55:38.512 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[37.142.242.98] loc failed
2018-12-08 01:07:41.353 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[94.54.26.13] loc failed
2018-12-08 01:13:36.722 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[107.77.226.13] loc failed
2018-12-08 01:24:37.047 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[212.58.120.105] loc failed
2018-12-08 01:25:14.341 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 請求失敗,code=1,message=Internal Service Error:ip[154.160.14.41] loc failed
......

上面為日誌檔案的錯誤部分,接下來將對這部分文字進行處理,擷取其中IP的部分輸出:

[[email protected] ~]$ grep -iE 'ERROR' info | sed -n 's/.*\[//p' | sed -n 's/\].*//p' 
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
182.68.246.99
65.74.21.178
37.142.242.98
......

sed提供了一種將多個sed命令合併執行的方式:{} , 上面的兩個sed命令可以合併執行,之間用分號間隔:

[[email protected] ~]$ grep -iE 'ERROR' info | sed '{s/.*\[//;s/\].*//}'              
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
....

sed中&的使用,替換固定的字串(對替換字元的補充) 如 sed 's/要被取代的字串正則/&新的字串/g'
其中&為被取代的字串

[[email protected] ~]$ cat 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
bozhu  :x:49012:1005::/home/bozhu:/bin/bash

[[email protected] ~]$ sed 's/^[a-z_-]\+/&_111/' passwd     
root_111:x:0:0:root:/root:/bin/bash
bin_111:x:1:1:bin:/bin:/sbin/nologin
daemon_111:x:2:2:daemon:/sbin:/sbin/nologin
adm_111:x:3:4:adm:/var/adm:/sbin/nologin
lp_111:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync_111:x:5:0:sync:/sbin:/bin/sync
shutdown_111:x:6:0:shutdown:/sbin:/sbin/shutdown
halt_111:x:7:0:halt:/sbin:/sbin/halt
mail_111:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator_111:x:11:0:operator:/root:/sbin/nologin
games_111:x:12:100:games:/usr/games:/sbin/nologin
ftp_111:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody_111:x:99:99:Nobody:/:/sbin/nologin

注意了上面的+號前面加了轉義字元,這是為什麼呢,因為在sed中 問號、加號、圓括號、花括號和豎線沒有特殊含義,就代表字元本身 如果要原本定義的實現特殊含義,需要用反斜槓(\)轉義

大小寫轉換:(元字元\u \l \U \L 轉換為大/小寫字元)
將每行的第一個字元轉換為大寫

[[email protected] ~]$ sed 's/^[a-z_-]\+/\u&/' 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
Sync:x:5:0:sync:/sbin:/bin/sync
Shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
Halt:x:7:0:halt:/sbin:/sbin/halt
Mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
Operator:x:11:0:operator:/root:/sbin/nologin
Games:x:12:100:games:/usr/games:/sbin/nologin
Ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

將資料夾下的txt檔案的檔名轉換為大寫

[[email protected] ~]$ ls *.txt
aa.txt  info.txt  qq.txt
[[email protected] ~]$ ls *.txt | sed -e 's/^\w\+/\U&/'
AA.txt
INFO.txt
QQ.txt

替換命令中組() 的用法: \1 \2 \3 獲取passwd中 USER UID 和 GID

[[email protected] ~]$ cat 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[[email protected] ~]$ sed 's/\(^[a-z1-9._-]\+\):x:\([0-9]\+\):\([0-9]\+\).*/USER:\1    UID:\2    GID:\3/' passwd 
USER:root    UID:0    GID:0
USER:bin    UID:1    GID:1
USER:daemon    UID:2    GID:2
USER:adm    UID:3    GID:4
USER:lp    UID:4    GID:7
USER:sync    UID:5    GID:0
USER:shutdown    UID:6    GID:0
USER:halt    UID:7    GID:0
USER:mail    UID:8    GID:12
USER:operator    UID:11    GID:0
USER:games    UID:12    GID:100
USER:ftp    UID:14    GID:50
USER:nobody    UID:99    GID:99

輸出eth0網絡卡的IP地址資訊:

[[email protected] ~]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.10.10.10  netmask 255.255.254.0  broadcast 172.31.31.255
        inet6 fe80::a830:5bff:fe3a:4cb4  prefixlen 64  scopeid 0x20<link>
        ether aa:30:5b:3a:4c:b4  txqueuelen 1000  (Ethernet)
        RX packets 201374082  bytes 54478001978 (50.7 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148223759  bytes 26295570488 (24.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[[email protected] ~]$ ifconfig eth0 |grep -E 'inet ' | sed 's/inet \([0-9.]\+\) .*/\1/' 
        172.10.10.10

-r : 複製指定檔案插入到匹配行 sed 'pattern r resourcefile' target 讀取resourcefile中的內容 插入到target的pattern的匹配行中進行展示 -w : 複製匹配行拷貝到指定檔案裡 sed 'pattern w targetfile' sourcefile 將sourcefile中指定pattern行 ,覆寫入targetfile中

q 提前退出sed

[[email protected] ~]$ nl passwd |sed '5q'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[[email protected] ~]$ nl passwd |sed '/mail/q'                                                                       
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[[email protected] ~]$ 

awk命令 —— 文字與資料處理工具(可程式設計/統計 製表 及更多功能)

awk的處理方式

  • awk一次處理一行內容
  • awk可以對每行可以切片處理
awk '{print $1}'  // 輸出首個單詞

awk格式

  • 命令列格式 $awk [options] 'command' file(s)
  • 指令碼格式 $awk f awk-script-file file(s)

命令列格式

  • 基本格式
  • 擴充套件格式
基本格式

$awk [options] 'command' file(s) //awk基本格式主要包括兩部分,一是options引數 二是command 命令
command : pattern {awk 操作命令} // command命令包括兩部分,一是 pattern(模式) 二是 操作命令
pattern : 正則表示式;邏輯判斷式 . // 模式可以由 正則表示式和邏輯判斷式組成
command操作命令:由大括號括起,它不像sed中只使用簡單的命令,也可以使用內建的函式,也可以使用控制指令if else while等等
內建函式:print() prinf() getline....
控制指令:if(){...}else{...} ; while(){...}

awk內建變數及引數應用
  1. awk內建變數1
    $0 : 整個當前行
    $1 : 每行第一個欄位
    $2 : 每行第二個欄位
  2. awk內建引數1:分隔符 -F
    options : -F file-separator(預設為空格)
[root@vm1 ~]# awk -F ':' '{print $1  $3}' passwd   // 預設print的輸出 username 與uid 是連在一起的
root0
bin1
daemon2
adm3
lp4
sync5
shutdown6
halt7
mail8
[root@vm1 ~]# awk -F ':' '{print $1,$3}' passwd   // 如果想讓他們分割顯示可以中間加逗號, 逗號的分割字元是空格
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@vm1 ~]# awk -F ':' '{print $1"\t "$3}' passwd   // 也可以在print語句的輸出中間加入其它字串
root	 0
bin	 1
daemon	 2
adm	 3
lp	 4
sync	 5
shutdown	 6
halt	 7
mail	 8
[root@vm1 ~]# awk -F ':' '{print "USER:"$1"\t ""UID:"$3}' passwd 
USER:root	 UID:0
USER:bin	 UID:1
USER:daemon	 UID:2
USER:adm	 UID:3
USER:lp	 UID:4
USER:sync	 UID:5
USER:shutdown	 UID:6
USER:halt	 UID:7
USER:mail	 UID:8
  1. awk內建變數2
    NR:每行的記錄行號 Number Of Record NF:每行的欄位總數 Number Of Field FILENAME:正在處理的檔名
[root@vm1 ~]# awk -F ':' '{print NR,NF}' passwd  // 分別列印行號和欄位總數
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
案例使用

案例一:顯示/etc/passwd 每行的行號,每行列數和對應行的使用者名稱(print,printf)

[root@vm1 ~]# awk -F ':' '{print "LINE: "NR,"COL: "NF,"USER:"$1}' passwd 
LINE: 1 COL: 7 USER:root
LINE: 2 COL: 7 USER:bin
LINE: 3 COL: 7 USER:daemon
LINE: 4 COL: 7 USER:adm
LINE: 5 COL: 7 USER:lp
LINE: 6 COL: 7 USER:sync
LINE: 7 COL: 7 USER:shutdown
LINE: 8 COL: 7 USER:halt
LINE: 9 COL: 7 USER:mail
[root@vm1 ~]# awk -F ':' '{printf("LINE:%3s COL:%s USER:%s\n" , NR,NF,$1)}' passwd   // printf 函式式輸出
LINE:  1 COL:7 USER:root
LINE:  2 COL:7 USER:bin
LINE:  3 COL:7 USER:daemon
LINE:  4 COL:7 USER:adm
LINE:  5 COL:7 USER:lp
LINE:  6 COL:7 USER:sync
LINE:  7 COL:7 USER:shutdown
LINE:  8 COL:7 USER:halt
LINE:  9 COL:7 USER:mail

案例二:顯示passwd中使用者ID大於100的行號和使用者名稱(if...else...)

[root@vm1 ~]#  awk -F ':' '{if($3>100) print "Line: "NR , "USER: "$1}' passwd 
Line: 17 USER: usbmuxd
Line: 19 USER: rtkit
Line: 20 USER: avahi-autoipd
Line: 22 USER: abrt
Line: 24 USER: nfsnobody
Line: 28 USER: saslauth
Line: 31 USER: pulse
Line: 34 USER: zhubo

找出檔案中Manager的薪水,並列印

[root@vm1 opt]# cat employee.txt 
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   Manager    Sales       $6,000
[root@vm1 opt]# sed -n '/Manager/p' employee.txt | awk '{print $5}'
$5,000
$9,500
$6,000
[root@vm1 opt]# awk '/Manager/{print $5}' employee.txt 
$5,000
$9,500
$6,000
[root@vm1 opt]# 
awk邏輯判斷式

~ !~ : 匹配正則表示式
== , != , < , > : 判斷邏輯表示式

[root@vm1 ~]# awk -F ':' '$1~/^r.*/{print $1}' passwd 
root
rpc
rtkit
rpcuser 
[root@vm1 ~]# awk -F ':' '$1!~/^r.*/{print $1}' passwd  // 取反
bin
daemon
adm
lp
sync
shutdown
[root@vm1 ~]# awk -F ':' '$3>100{print $1,$3}' passwd  // uid > 100
usbmuxd 113
rtkit 499
avahi-autoipd 170
abrt 173
nfsnobody 65534
saslauth 498
pulse 497
zhubo 500
擴充套件格式

$ awk [options] 'commands' file(s) command2擴充套件 : BEGIN{print "start"}pattern{commands}END{print "end"} BEGIN是在迴圈之前執行 END是在迴圈之後執行不參與迴圈得過程
案例一:顯示passwd中每行行號,每行的列數,對應行的使用者名稱

[root@vm1 ~]# awk -F ':' 'BEGIN{print "Line   Col   User"}{print NR,NF,$1}END{print "------"FILENAME"-----"}' passwd 
Line   Col   User
1 7 root
2 7 bin
3 7 daemon
4 7 adm
5 7 lp
6 7 sync
7 7 shutdown
8 7 halt
9 7 mail
10 7 uucp
11 7 operator
12 7 games
------passwd-----

案例一: 統計當前資料夾下的檔案/資料夾佔用大小

[root@vm1 ~]# ls -l
總用量 104
-rw-------. 1 root root  1609 7月   7 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 46478 7月   7 18:41 install.log
-rw-r--r--. 1 root root 10033 7月   7 18:39 install.log.syslog
-rw-r--r--. 1 root root  1620 12月 10 21:19 passwd
drwxr-xr-x. 2 root root  4096 7月   7 10:53 公共的
drwxr-xr-x. 2 root root  4096 7月   7 10:53 模板
drwxr-xr-x. 2 root root  4096 7月   7 10:53 視訊
drwxr-xr-x. 2 root root  4096 7月   7 10:53 圖片
drwxr-xr-x. 2 root root  4096 7月   7 10:53 文件
drwxr-xr-x. 2 root root  4096 7月   7 10:53 下載
drwxr-xr-x. 2 root root  4096 7月   7 10:53 音樂
drwxr-xr-x. 2 root root  4096 7月   7 10:53 桌面
[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size}'
size is 92508
[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size/1024"K"}'
size is 90.3398K

案例二:統計顯示passwd的賬戶總人數

[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd  //排除空行
34

統計UID>100的賬戶總人數

[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 
0 usbmuxd
1 rtkit
2 avahi-autoipd
3 abrt
4 nfsnobody
5 saslauth
6 pulse
7 zhubo

案例三: 統計netstat -amp 狀態下 LISTEN和CONNECTED的連線狀態

[root@vm1 ~]# netstat -anp
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ]     STREAM     LISTENING     15997  2268/gnome-session  @/tmp/.ICE-unix/2268
unix  2      [ ]     STREAM     LISTENING     15723  2181/Xorg           /tmp/.X11-unix/X0
unix  2      [ ]     STREAM     LISTENING     15998  2268/gnome-session  /tmp/.ICE-unix/2268
unix  2      [ ]     STREAM     LISTENING     16065  2275/gconfd-2       /tmp/orbit-gdm/linc-8e3-0-3681d67c590fa
unix  2      [ ]     STREAM     LISTENING     16139  2268/gnome-session  /tmp/orbit-gdm/linc-8dc-0-756f0d535b355
unix  2      [ ]     STREAM     LISTENING     16240  2295/gnome-settings /tmp/orbit-gdm/linc-8f7-0-2d979a559d723
unix  2      [ ]     STREAM     LISTENING     16312  2297/bonobo-activat /tmp/orbit-gdm/linc-8f9-0-3e19569c5dda2
unix  3      [ ]         STREAM     CONNECTED     16738  1622/dbus-daemon    /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     16737  2317/polkitd        
unix  3      [ ]         STREAM     CONNECTED     16653  1622/dbus-daemon    /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     16652  2311/polkit-gnome-a 
unix  3      [ ]         STREAM     CONNECTED     16747  2311/polkit-gnome-a /tmp/orbit-gdm/linc-907-0-116ec6d6f190f
unix  3      [ ]         STREAM     CONNECTED     16649  2294/at-spi-registr 
unix  3      [ ]         STREAM     CONNECTED     16646  2294/at-spi-registr /tmp/orbit-gdm/linc-8f6-0-3a2c08ec5e139
unix  3      [ ]         STREAM     CONNECTED     16645  2311/polkit-gnome-a 
unix  3      [ ]         STREAM     CONNECTED     16642  2181/Xorg           @/tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     16641  2311/polkit-gnome-a 
unix  3      [ ]         STREAM     CONNECTED     16633  2309/gnome-power-ma /
[root@vm1 ~]# netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i , sum[i]}'
CONNECTED 226
LISTEN 12

公眾號

公眾號