• 當前位置:首頁 > IT技術 > 系統服務 > 正文

    Shell 正則表達式
    2021-09-13 15:47:12

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

    1. 正則表達式

    1.1 正則表達式的概念

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

    1.2 正則表達式與通配符

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

    shell 命令通配符:
    *:匹配任意內容
    ?:匹配任意一個內容
    []:匹配中括號中的一個字符

    ?

    例子:
    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 基礎正則表達式

    正則表達式分為:

    • 基礎正則表達式
    • 擴展正則表達式

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

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

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

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

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

    ?

    1.4 幾個例子

    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 [選項] [正則表達式] [文件]

    常用選項:

    • -v:反匹配,找出不匹配的行
    • -n:顯示行號
    • -i:不區分大小寫
    • --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 [選項] 文件名

    選項:

    • -f?列號:提取第幾列
    • -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

    缺陷:適合以制表符為分隔符的文檔,以空格為分隔符時難以實現需求.

    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 '輸出類型輸出格式' 輸出內容

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

    2.4 awk 命令

    ?

    2.5 sed 命令

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

    sed [選項] ‘[動作]’ 文件名

    選項:

    -n:一般 sed 命令會把所有數據都輸出到屏幕,如果加入次選項則只會把經過 sed 命令處理的行輸出到屏幕.
    -e:允許對輸入數據應用多條命令編輯
    -i:用 sed 命令修改結果直接修改讀取數據的文件,而不是由屏幕輸出.
    動作:

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

    3. 字符處理命令

    3.1 sort 命令

    sort [選項] 文件名

    項:

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

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

    3.2 wc 命令

    wc [選項] 文件

    選項:

    • -l:只統計行數
    • -w:只統計單詞數
    • -m:只統級字符數

    ?

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

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码