1. 程式人生 > 實用技巧 >7-2.檔案處理工具之grep案例分析

7-2.檔案處理工具之grep案例分析

1.顯示/proc/meminfo檔案中以大小s開頭的行(要求:使用兩種方法)

案例思路
分析:首先大小s,我們可以想到-i忽略大小選項,s開頭的行可以用行首錨定符^,用"."代表s後面的任意字元,用"*"表示前面點字元重複不確定次數。

[root@localhost data]# grep -in '^s.*' /proc/meminfo 
6:SwapCached:            0 kB
15:SwapTotal:       4194300 kB
16:SwapFree:        4194300 kB
21:Shmem:              9724 kB
22:Slab:              93044 kB
23:SReclaimable:      40760 kB
24:SUnreclaim:        52284 kB
[root@localhost data]# grep -Ein '^(S|s)' /proc/meminfo 
6:SwapCached:            0 kB
15:SwapTotal:       4194300 kB
16:SwapFree:        4194300 kB
21:Shmem:              9724 kB
22:Slab:              93012 kB
23:SReclaimable:      40760 kB
24:SUnreclaim:        52252 kB

2.顯示/etc/passwd檔案中不以/bin/bash結尾的行

案例思路
分析:以/bin/bash結尾的行,我們可以使用行尾錨定符$來實現,而題目結果是不以/bin/bash結尾的行,那麼只要使用-v顯示不被pattern匹配到的行就可以了。

[root@localhost data]# grep -nv '/bin/bash$' /etc/passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

3.顯示使用者rpc預設的shell程式

案例思路
分析:顯示使用者rpc,那麼就是以r開頭,c結尾,可以使用行首錨定符^,結尾部分用詞尾錨定>,那麼這樣就可以找出符合要求的使用者的,再通過cut取列就能拿到該使用者的shell程式。

[root@localhost data]# grep '^rpc\>' /etc/passwd|cut -d":" -f7
/bin/bash

4.找出/etc/passwd中的兩位或三位數

案例思路
分析:匹配任意數字可以使用[0-9]來實現,而兩位或三位數,我們首先想到用{m,n}這個實現,數字開頭和結尾可以用詞首和詞尾來錨定。

[root@localhost data]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

5.顯示CentOS7的/etc/grub2.cfg檔案中,至少以一個空白字元開頭的且後面有非空白字元的行

案例思路
分析:匹配空白字元,首先我們想到有個[:space:],這個可以匹配水平和垂直的空白字元,而非空白字元則可以加上^來實現,至少一個,那麼可以用使用+匹配其前面的字元至少1次,字元開頭使用^行首錨定符來實現。

[root@localhost data]# grep -on "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg|head
12:  load_env
15:   set
16:   set
17:   save_env
18:   set
20:   set
24:  menuentry_id_option="--id"
26:  menuentry_id_option=""
32:  set
33:  save_env

6.找出“netstat -tan” 命令結果中以LISTEN後跟任意多個空白字元結尾的行

案例思路
分析:以多個空白字元結尾的行,可以使用[[:space:]]*$來匹配,-E使用擴充套件正則。

[root@localhost data]# netstat -tan |grep -En '(LISTEN[[:space:]]*)$'
3:tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
4:tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
6:tcp6       0      0 :::22                   :::*                    LISTEN     
7:tcp6       0      0 ::1:25                  :::*                    LISTEN

7.顯示CentOS7上所有UID小於1000以內的使用者名稱和UID

案例思路
分析:首先顯示使用者名稱和UID,我們想到用cut命令,可以按列把使用者名稱和UID取出來,然後小於1000以內的UID,用{m,n}表示取數範圍。

[root@localhost data]# cat /etc/passwd|cut -d: -f1,3 | grep "\<[0-9]\{,3\}\>"
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-network:192
dbus:81
polkitd:999
sshd:74
postfix:89

8.新增使用者bash、 testbash、 basher、 sh、 nologin(其shell為/sbin/nologin),找出/etc/passwd使用者名稱和shell同名的行

案例思路
分析:

useradd bash -s /sbin/nologin 
useradd testbash -s /sbin/nologin
useradd basher -s /sbin/nologin
useradd sh -s /sbin/nologin 
useradd nologin -s /sbin/nologin
[root@localhost data]# grep "^\(.*\)\>.*\1\>$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:1006:1006::/home/nologin:/sbin/nologin

9.利用df和grep,取出磁碟各分割槽利用率,並從大到小排序

案例思路
分析:首先用^/dev/sd匹配出各個磁碟分割槽,然後用[0-9]+%匹配出各個磁碟分割槽的利用率,最後用sort進行排序。

[root@localhost data]# df -h|grep "^/dev/sd"|grep -o "[0-9]\+%"|sort -nr
13%
2%
1%