1. 程式人生 > 程式設計 >Shell中正則表示式及sed和awk常見問題

Shell中正則表示式及sed和awk常見問題

目錄
  • 1 正則表示式中的+、?、*分別表示什麼含義?
  • 2 如何編寫正則表示式匹配11位的手機號?
  • 3 簡述sed定址符的作用及表示方式。
  • 4 如何使用sed提取文字中的偶數行?
  • 5 如何使用sed刪除文字中每行的第4個字元?
  • 6 提取/etc/passwd檔案的第6-10行,另存為pass5.txt檔案。
  • 7 簡述awk工具的基本語法格式。
  • 8 簡述awk工具常用的內建變數、各自的作用。
  • 9 awk處理文字時,讀檔案前、讀取檔案內容中、讀檔案後後這三個環節是如何表示的?
  • 10 提取當前eth0網絡卡的IPv4地址及掩碼資訊。
  • 11 找出UID位於10~20之間的使用者,輸出使用者名稱及對應的UID。
  • 12 利用awk工具統計使用bash作為直譯器的使用者數量。
  • 13 在awk中是否可以使用陣列,分別以什麼構成?
  • 14 在中對文字的排序如何實現?

1 正則表示式中的+、?、*分別表示什麼含義?

這三個字元用來限制關鍵詞的匹配次數,含義分別如下:

  • +:最少匹配一次,比如a+可匹配a、aa、aaa等
  • ?:最多匹配一次,比如a?可匹配零個或一個a
  • *:匹配任意多次,比如a*可匹配零個或任意多個連續的a

2 如何編寫正則表示式匹配11位的手機號?

準備測試檔案:
[root@svr5 ~]# cat tel.txt 
01012315
137012345678
13401234567
10086
18966677788
提取包含11位手機號的行:
[root@svr5 ~]# egrep '^1[0-9]{10}$' tel.txt 
13401234567
18966677788

3 簡述sed定址符的作用及表示方式。

作用:地址符(執行指令的條件)控制sed需要處理文字的範圍;不加定址符則逐行處理所有行
表示方式:地址符可以使用行號或正則表示式

4 如何使用sed提取文字中的偶數行?

檢視測試文字:

[root@svr5 ~]# cat -n /etc/rc.local 
     1  #!/bin/sh
     2  #
     3  # This script will be executed *after* all the other init scripts.
     4  # You can put your own initialization stuff in here if you don't
     5  # want to do the full Sys
V style init stuff. 6 7 touch /var/lock/subsys/local

提取偶數行的操作及效果:

[root@svr5 ~]# cat -n /etc/rc.local | sed -n '2~2p'
     2  #
     4  # You can put your own initialization stuff in here if you don't
     6

5 如何使用sed刪除文字中每行的第4個字元?

檢視測試文字:

[root@svr5 ~]# cat /etc/rc.local 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

刪除每行第4個字元的操作及效果:

[root@svr5 ~]# cat /etc/rc.local | sed 's/.//4'
#!/in/sh
#
# Tis script will be executed *after* all the other init IBdBvscripts.
# Yu can put your own initialization stuff in here if you don't
# wnt to do the full Sys V style init stuff.
touh /var/lock/subsys/local

6 提取/etc/passwd檔案的第6-10行,另存為pass5.txt檔案。

提取或匯出文字:

[root@svr5 ~]# sed -n '6,10p' /etc/passwd > pass5.txt

確認提取結果:

[root@svr5 ~]# cat pass5.txt 
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

7 簡述awk工具的基本語法格式。

格式1: awk [選項] ‘[條件]{處理動作}' 檔案列表
格式2: 命令 | awk [選項] ‘[條件]{處理動作}'

8 簡述awk工具常用的內建變數、各自的作用。

  • $n:即$1、$2、$3……,表示指定分隔的第幾個欄位
  • $0:儲存當前讀入的整行文字內容
  • NF:記錄當前處理行的欄位個數(列數)
  • NR:記錄當前已讀入行的數量(行數)

9 awk處理文字時,讀檔案前、讀取檔案內容中、讀檔案後後這三個環節是如何表示的?

  • BEGIN{ } 檔案前處理:awk沒有讀入行之前 要執行的動作; 一般對資料作初始化操作,可以單獨使用。
  • { } 行處理:對awk讀入的每一行進行處理,可以單獨使用。
  • END{ }檔案後處理:awk 把所有的行都處理完後要執行的動作,一般輸出資料處理的結果。可以單獨使用。

10 提取當前eth0網絡卡的IPv4地址及掩碼資訊。

檢視測試文字:

[root@svr5 ~]# ip add list eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:64:88:8e brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.55/24 brd 192.168.4.255 scope global eth0
    inet 192.168.4.5/24 brd 192.168.4.255 scope global secondary eth0
    inet6 fe80::20c:29ff:fe64:888e/64 scope link 
       valid_lft forever preferred_lft forever

提取IPv4地址及掩碼資訊的操作及效果:

[root@svr5 ~]# ip add list eth0 | awk '/\<inet\>/{print $2}'
192.168.4.55/24
192.168.4.5/24

11 找出UID位於10~20之間的使用者,輸出使用者名稱及對應的UID。

[root@svr5 ~]# awk -F: '$3>=10 && $3<=20{print $1":"$3}' /etc/passwd
uucp:10
operator:11
games:12
gopher:13
ftp:14

12 利用awk工具統計使用bash作為直譯器的使用者數量。

使用NF內建變數找IBdBv最後一列的內容,匹配bash即可讓x+1:

[root@svr5 ~]# awk -F/ '$NF=="bash"{x++}END{print x}' /etc/passwd

13 在awk中是否可以使用陣列,分別以什麼構成?

可以使用陣列,分別以 陣列名、下標、值 三個部分構成

14 在linux中對文字的排序如何實現?

使用sort命令,比如abc.txt文字
另外還可以使用選項-n按數字升序排列 -k:針對指定的列進行排序 -r:反向排序

[root@svr5 ~]# sort –n abc.txt

到此這篇關於Shell中正則表示式及sed和awk常見問題的文章就介紹到這了,更多相關Shell正則表示式及sed和awk內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!