Shell—擴充套件正規表示式(awk、sort、uniq、tr工具)

康丶發表於2020-11-13

前言

正規表示式對於系統管理員來說是非常重要的,熟練運用正規表示式可使工作變得更加簡單、方便。

擴充套件正規表示式

擴充套件正規表示式是對基礎正規表示式的擴充深化

1、擴充套件元字元

grep命令僅支援基礎正規表示式,如果使用擴充套件正規表示式,需要使用egrep或awk命令

+ :匹配前面子表示式1次以上
例:
[ root@server2 ~]# egrep -n 'o+' test.txt     
#檔案檢索出至少帶有一個o的行並顯示行號

■  ? :匹配前面子表示式0次或者1次
例: 
[ root@server2 ~]# egrep -n 'bes?t' test.txt
#檔案檢索出帶有 ‘bet’ 或 ‘best’ 的行並顯示行號

  () :將括號中的字串作為一個整體
例:
[ root@server2 ~]# egrep -n '(oo)+' test.txt
#檔案檢索出至少帶有連續oo或更多偶數oo的行並顯示行號

■   |  :以或的方式匹配字條串
例:
[root@server2 ~]# egrep -n 'sh(o|i)rt’ test.txt
#檔案檢索出帶有 ‘short’ 或 ‘shirt’ 的行並顯示行號

2、awk工具

是一個功能強大的編輯工具,預設以空格為分隔符進行分隔,逐行讀取輸入文字,並根據指定的匹配模式進行查詢,對符合條件的內容進行格式輸出或者過濾處理,可以在無互動的情況下實現相當複雜的文字操作,被廣泛應用於Shell指令碼,完成各種自動配置任務。

命令格式:
awk 選項 ‘模式或條件 {編輯指令}’ 檔案1 檔案2 #過濾並輸出檔案中符合條件的內容
awk -f 指令碼檔案 檔案1 檔案2 #從指令碼中呼叫編輯指令,過濾並輸出內容

awk內建變數
FS:指定每行文字的欄位分隔符,預設為空格或製表位。
NF:當前處理的行的欄位個數。
NR:當前處理的行的行號(序數)。
$0:當前處理的行的整行內容。
$n:當前處理行的第n個欄位(第n列)。
FILENAME:被處理的檔名。
RS:資料記錄分隔,預設為\n,即每行為一條記錄。

用法示例

2.1 按行輸出文字

awk -F: 'NR==6{print $1,$7}' /etc/passwd   #輸出第六行以:分隔的第1和第7欄位
awk -F: '(NR==6)&&(NR==10){print $1,$7}' /etc/passwd   #輸出第六到第十行以:分隔的第1和第7欄位
awk -F: '(NR>=6)&&(NR<=10){print $1,$7}' /etc/passwd   #輸出第六到第十行以:分隔的第1和第7欄位
awk -F: '(NR==6)||(NR==10){print $1,$7}' /etc/passwd   #輸出第六和第十行以:分隔的第1和第7欄位
awk -F: '(NR%2)==1{print}' /etc/passwd | wc -l   #行號%2餘數=1為奇數,統計奇數行數
awk -F: '(NR%2)==0{print}' /etc/passwd | wc -l   #行號%2餘數=0為偶數,統計偶數行數
awk -F: '(NR%2)==0{print $1,$7}' /etc/passwd  #輸出所有偶數行以:分隔的第1和第7欄位
awk -F: '/^root/{print}' /etc/passwd    #輸出所有以root開頭的行
awk -F: '/^root/{print $0}' /etc/passwd    #輸出所有以root開頭的行
awk ‘/nologin$/{print}/etc/passwd    #輸出以nologin結尾的行
awk ‘BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}/etc/passwd   #統計以/bin/bash結尾的行數,等同於grep –c “/bin/bash$” /etc/passwd
awk ‘BEGIN {RS=””};END {print NR}’ test.txt    #統計以空行分隔的文字段落數

2.2 按欄位輸出文字

awk ‘{print $3}’ test.txt      #輸出每行中(以空格或製表符分隔)的第三個欄位
awk ‘{print $1,$3}’ test.txt     #輸出每行中第13個欄位
awk -F: ‘$2==”!!”{print}/etc/shadow   #輸出所有以:分隔的第2欄位等於!!的,沒密碼的
awk -F: ‘$2==”!!”{print $1}/etc/shadow  #輸出所有密碼為空的第1欄位使用者名稱
awk 'BEGIN {FS=":"};$2=="! ! "{print} ' /etc/shadow  #輸出密碼為空的使用者的shadow 記錄
awk -F: ‘$7~”sh”{print $1}/etc/shadow   #輸出以冒號分隔且第7個欄位中包含sh的行的第一個欄位;注:~表示當前使用者的意思
awk '($1~"http")&&(NF==4){print $1}' /etc/services  #輸出包含4個欄位且第一個欄位中包含http的行的第1個欄位
awk -F: ($7!=/bin/bash”)&&($7!=/sbin/nologin”){print}/etc/passwd  #輸出第七個欄位既不為/bin/bash也不為/sbin/nologin的所有行

2.3 通過管道、雙引號呼叫Shell命令

awk -F: '/ bash$/{print}' /etc/passwd l wc -l
awk -F: '/ bash$/{print | "wc -l"}' /etc/passwd
#呼叫wc –l命令統計使用bash的使用者的個數,等同於grep –c “bash$” /etc/passwd
awk 'BEGIN {while ("w" l getline) n++; {print n-2}}'  #呼叫w命令,並用來統計線上使用者數
awk ‘BEGIN {“hostname” | getline ; print $0}’     #呼叫hostname,並輸出當前主機名

3、sort工具

依據不同的資料型別進行排序
字元排序——預設
數字排序

語法格式
sort [選項] 引數

常用選項
在這裡插入圖片描述

用法示例
例1:將/etc/passwd 檔案中的賬號進行排序,預設是按首字母順序排序

[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lisi:x:1002:1002::/home/lisi:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shi:x:1000:1000:shi:/home/shi:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
vuser:x:1003:1003::/opt/vuser:/sbin/nologin
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash

例2:將/etc/passwd檔案中第三列進行反向排序

[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd 
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
vuser:x:1003:1003::/opt/vuser:/sbin/nologin
lisi:x:1002:1002::/home/lisi:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
shi:x:1000:1000:shi:/home/shi:/bin/bash
root:x:0:0:root:/root:/bin/bash

4、uniq工具

uniq工具在Linux系統中通常與sort命令結合使用,用於報告或者忽略檔案中的重複行

常用選項
-c:進行計數;
-d:僅顯示重複行;
-u:僅顯示出現一次的行

用法示例

專案用文件
[root@localhost ~]# vim xiangmu.txt 
1
1
2
2
3
4
5
10
11
11
aaa
aaa
bb
nnnn
nnnn

1、把重複的行合併

[root@server2 ~]# uniq xiangmu.txt
1
2
3
4
5
10
11
aaa
bb
nnnn

2、重複行統計

[root@server2 ~]# uniq -c xiangmu.txt
      2 1
      2 2
      1 3
      1 4
      1 5
      1 10
      2 11
      2 aaa
      1 bb
      2 nnnn

3、只顯示重複行

[root@server2 ~]# uniq -d xiangmu.txt
1
2
11
aaa
nnnn

5、tr工具

tr命令常用來對來自標準輸入的字元進行替換、壓縮和刪除

語法格式
tr [選項] [引數]

常用選項
-c:取代所有不屬於第一字符集的字元;
-d:刪除所有屬於第一字符集的字元;
-s:把連續重複的字元以單獨一個字元表示;
-t :先刪除第一字符集較第二字符集多出的字元,做替換

用法示例
例1:將輸入字元由大寫轉換為小寫

[root@localhost ~]# echo "HELLO"|tr 'A-Z' 'a-z'
hello

例2:壓縮輸入中重複的字元

[root@localhost ~]# echo "thissss is a text linnnnnnne." | tr -s 'sn'
this is a text line.

例3:刪除字串中某些字元

[root@localhost ~]# echo 'hello world’ | tr -d 'od'
hell wrl

例4:取代所有不屬於第一字符集的字元

[root@localhost ~]# echo abccabacca | tr -c ab 0
ab00aba00a0

例5:先刪除第一字符集較第二字符集多出的字元,做替換

[root@localhost ~]# echo abcabc123 | tr -t 'abc' 'd'
dbcdbc123
[root@localhost ~]# echo abcabc123 | tr -t 'abc’ 'ttt'
tttttt123
[root@localhost ~]# echo abcabc123 | tr -t 'ab’ 'ttt'
ttcttc123

相關文章