Shell—擴充套件正規表示式(awk、sort、uniq、tr工具)
前言
正規表示式對於系統管理員來說是非常重要的,熟練運用正規表示式可使工作變得更加簡單、方便。
擴充套件正規表示式
擴充套件正規表示式是對基礎正規表示式的擴充深化
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 #輸出每行中第1,3個欄位
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
相關文章
- 『忘了再學』Shell基礎 — 25、擴充套件正規表示式套件
- Linux shell工具grep awk cut sort uniq sort 使用小結Linux
- [Shell] awk學習(3)-regular expression 正規表示式Express
- 擴充正規表示式命令總結
- 擴充套件表示式套件
- Shell 常用字元處理命令cut/sort/wc/uniq/tee/tr/split字元
- Swift 開發的工具類,主要是提供正規表示式及其它類的擴充套件(新增加)Swift套件
- shell指令碼正規表示式指令碼
- 幾個常用的文字處理shell 命令:find、grep、sort、uniq、sed、awk
- 使用awk+sort+uniq進行文字分析
- shell指令碼(14)-正規表示式指令碼
- shell基礎 — 基本正規表示式
- 常用正規表示式工具
- python工具_正規表示式Python
- 正規表示式驗證工具
- shell中擴充套件命令套件
- Shell第二篇:正規表示式和文字處理工具
- 擴充套件工具套件
- shell程式設計(四)| grep正規表示式程式設計
- shell程式設計(四)| sed 正規表示式程式設計
- 05 shell程式設計之正規表示式程式設計
- 正則的擴充套件套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- GNOME Shell Extension常用擴充套件套件
- 正規表示式
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 『忘了再學』Shell基礎 — 24、Shell正規表示式的使用
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- discuz擴充套件工具集合套件
- 文字處理工具之grup && 正規表示式
- 【JavaScript】正規表示式JavaScript
- php –正規表示式PHP
- 正規表示式 教程
- 正規表示式 split()
- java正規表示式Java
- PHP正規表示式PHP
- javascript正規表示式JavaScript
- 【java】正規表示式Java