當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

Shell 正則表達(dá)式
2021-09-13 15:47:12

文章目錄
1. 正則表達(dá)式
1.1 正則表達(dá)式的概念
1.2 正則表達(dá)式與通配符
1.3 基礎(chǔ)正則表達(dá)式
1.4 幾個(gè)例子
2. 字符截取命令
2.1 grep 命令
2.2 cut 命令
2.3 printf 命令
2.4 awk 命令
2.5 sed 命令
3. 字符處理命令
3.1 sort 命令
3.2 wc 命令

1. 正則表達(dá)式

1.1 正則表達(dá)式的概念

?正則表達(dá)式是用于描述字符排列和匹配模式的一種語(yǔ)法規(guī)則. 它主要用于字符串的模式分割、匹配、查找及替換操作.

1.2 正則表達(dá)式與通配符

正則表達(dá)式用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、egrep、awk、sed 等命令可以支持正則表達(dá)式。
通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp 這些命令不支持正則表達(dá)式。

shell 命令通配符:
*:匹配任意內(nèi)容
?:匹配任意一個(gè)內(nèi)容
[]:匹配中括號(hào)中的一個(gè)字符

?

例子:
user@ubuntu:~# touch abc.txt adc.txt
user@ubuntu:~# ls

abc.txt adc.txt anaconda-ks.cfg
user@ubuntu:~# ls a*
abc.txt adc.txt anaconda-ks.cfg
user@ubuntu:~# ls a?c.txt
abc.txt adc.txt
user@ubuntu:~# ls a[bd]c.txt
abc.txt adc.txt

1.3 基礎(chǔ)正則表達(dá)式

正則表達(dá)式分為:

  • 基礎(chǔ)正則表達(dá)式
  • 擴(kuò)展正則表達(dá)式

1、基礎(chǔ)正則表達(dá)式常見元字符(支持的工具:grep、egrep、sed、awk)

 :轉(zhuǎn)義字符,用于取消特殊符號(hào)的含義,例: !、
、$等
^ :匹配字符串開始的位置,例: ^a、 ^the、 #、[a-z]
$ :匹配字符串結(jié)束的位置,例: word$、^$匹配空行
. :匹配除
之外的任意的一個(gè)字符,例: go.d、 g…d
* :匹配前面子表達(dá)式0次或者多次,例: goo*d、 go.*d
[list] :匹配list列表中的一個(gè)字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位數(shù)字
[^list] :匹配任意非list列表中的一個(gè)字符,例: [^0-9]、 [^A-Z0-9]、 [^a-z]匹配任意一位非小寫字母
{n} :匹配前面的子表達(dá)式n次,例: go{2}d、 '[0-9]{2} '匹配兩位數(shù)字
{n,} :匹配前而的子表達(dá)式不少于n次,例: go{2, }d、’[0-9]{2, }'匹配兩位及兩位以上數(shù)字
{n,m}: 匹配前面的子表達(dá)式n到m次,例: go{2,3}d、'[0-9]{2,3}'匹配兩位到三位數(shù)字

注:egrep、awk使用{n}、{n,}、{n,m}匹配時(shí)"{}"前面不用加""

2、擴(kuò)展正則表達(dá)式元字符(支持的工具:egrep、awk)

+ :匹配前面子表達(dá)式1次以上,例: go+d, 將匹配至少一個(gè)o, 如god、 good、 goood等
? :匹配前面子表達(dá)式0次或者1次,例: go?d, 將匹配gd或god
() )將括號(hào)中的字符串作為h一個(gè)整體,例1: g(oo)+d," 將匹配oo整體1次以上,如good、gooood等
| :以或的方式匹配字條串,例: g (oo|la)d," 將匹配good或者glad

?

1.4 幾個(gè)例子

1.?匹配日期格式 YYYY-MM-DD

[0-9]{4}-[0-9]{2}-[0-9]{2}

2.?匹配IP地址

[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

2. 字符截取命令

2.1 grep 命令

grep?命令用來行提取字符串:

grep [選項(xiàng)] [正則表達(dá)式] [文件]

常用選項(xiàng):

  • -v:反匹配,找出不匹配的行
  • -n:顯示行號(hào)
  • -i:不區(qū)分大小寫
  • --color:[ always | nerver | auto ] 顏色高亮

user@ubuntu:~# grep "bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
lucifer:x:1000:1000::/home/lucifer:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash


user@ubuntu:~# grep -n "bin/bash" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
26:lucifer:x:1000:1000::/home/lucifer:/bin/bash
27:user1:x:1001:1001::/home/user1:/bin/bash
28:user2:x:1002:1002::/home/user2:/bin/bash
user@ubuntu:~# grep "bin/bash" /etc/passwd | grep -v "root"
lucifer:x:1000:1000::/home/lucifer:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash

?

2.2 egrep 命令

yao@yao-PC:~/ylx/shell-code/regular-expression$ bash getnumber.sh
02588888888
025 54325753
025-85556666
(025) 85556666
yao@yao-PC:~/ylx/shell-code/regular-expression$ cat getnumber.sh
#!/bin/bash

egrep "^(?025)?[ -]?[58][0-9]{7}$" 01.txt

?

2.2 cut 命令

cut 命令用來列提取字符串:

cut [選項(xiàng)] 文件名

選項(xiàng):

  • -f?列號(hào):提取第幾列
  • -d?分隔符:按照指定分隔符分割列

student.txt?文件如下,其中使用制表符

ID Name Gender Mark
1 Ford M 85
2 White M 60
3 Clyde M 70

user@ubuntu:~# cut -f 2 student.txt
Name
Ford
White
Clyde

user@ubuntu:~# cut -f 2,4 student.txt
Name Mark
Ford 85
White 60
Clyde 70

user@ubuntu:~# grep "bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
lucifer
user1
user2

缺陷:適合以制表符為分隔符的文檔,以空格為分隔符時(shí)難以實(shí)現(xiàn)需求.

user@ubuntu:~# df -h | cut -f 5
Filesystem Size Used Avail Use% Mounted on
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 19G 1.5G 18G 8% /
/dev/sda1 488M 117M 336M 26% /boot
tmpfs 182M 0 182M 0% /run/user/0

user@ubuntu:~# df -h | cut -f 1,3 -d " "
Filesystem
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/sda3
/dev/sda1
tmpfs

2.3 printf 命令

printf '輸出類型輸出格式' 輸出內(nèi)容

輸出類型:
%ns:輸出字符串. n 是數(shù)字指代輸出幾個(gè)字符.
%ni:輸出整數(shù). n 是數(shù)字指代輸出幾個(gè)數(shù)字
%m.nf:輸出浮點(diǎn)數(shù). m 和 n 是數(shù)字,指代輸出的整數(shù)位和小數(shù)位,如 %8.2f 代表共輸出 8 位數(shù),其中 2 位是小數(shù),6位是整數(shù).
輸出格式:
a:輸出警告聲音
:輸出退格鍵,也就是 Backspace 鍵
f:清除屏幕
:換行
:回車,也就是 Enter 鍵
:水平輸出退格鍵,也就是 Tab 鍵
v:垂直輸出退格鍵,也就是 Tab 鍵

2.4 awk 命令

?

2.5 sed 命令

sed 是一種幾乎包括所有 UNIX 平臺(tái)(包括 Linux)的輕量級(jí)流編輯器. sed 主要是用來將數(shù)據(jù)進(jìn)行選取、替換、刪除、新增的命令.

sed [選項(xiàng)] ‘[動(dòng)作]’ 文件名

選項(xiàng):

-n:一般 sed 命令會(huì)把所有數(shù)據(jù)都輸出到屏幕,如果加入次選項(xiàng)則只會(huì)把經(jīng)過 sed 命令處理的行輸出到屏幕.
-e:允許對(duì)輸入數(shù)據(jù)應(yīng)用多條命令編輯
-i:用 sed 命令修改結(jié)果直接修改讀取數(shù)據(jù)的文件,而不是由屏幕輸出.
動(dòng)作:

a:追加,在當(dāng)前行后添加一行或多行
c:行替換,用 c 后面的字符串替換原數(shù)據(jù)行
i:插入,在當(dāng)期行前插入一行或多行.
d:刪除,刪除指定的行
p:打印,輸出指定的行.
s:字串替換,用一個(gè)字符串替換另外一個(gè)字符串. 格式為 “行范圍s/舊字串/新字串/g”(和 vim 中的替換格式類似).

3. 字符處理命令

3.1 sort 命令

sort [選項(xiàng)] 文件名

項(xiàng):

  • -f:忽略大小寫
  • -n:以數(shù)值型進(jìn)行排序,默認(rèn)使用字符串型排序
  • -r:反向排序
  • -t:指定分隔符,默認(rèn)分隔符是制表符
  • -k n[,m]:按照指定的字段范圍排序. 從第 n 字段開始,m 字段結(jié)束(默認(rèn)到行尾)

sort -n -t ":" -k 3,3 /etc/passwd

3.2 wc 命令

wc [選項(xiàng)] 文件

選項(xiàng):

  • -l:只統(tǒng)計(jì)行數(shù)
  • -w:只統(tǒng)計(jì)單詞數(shù)
  • -m:只統(tǒng)級(jí)字符數(shù)

?

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >