根據作業淺析正則表達式

    什么是正則?正則就是,那種體現出某種規律的不變性或者對稱性的物理量或關系。
    正則表達式(Regular Expression):由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能(linux中,可以使用:man 7 regex命令查看。)
程序支持: grep,sed,awk,vim, less,nginx,varnish等
    分類:基本正則表達式: BRE
擴展正則表達式: ERE
    元字符分類:字符匹配、匹配次數、位置錨定、分組。
    本篇文章通過一些作業題來淺析正則表達式的用法。
1、顯示/proc/meminfo文件中以大小s開頭的行?
答案:
[root@CentOS7 ~]# grep “^[S\|s]” /proc/meminfo
SwapCached:            0 kB
SwapTotal:          2044 kB
SwapFree:           2044 kB
Shmem:              9108 kB
Slab:                   65388 kB
SReclaimable:      25776 kB

    其中,正則表達式^[S\|s]中 ,S\|s 表示“S或s”的意思;

[S\|s]表示匹配S或者s;

^[S\|s]表示匹配以S為行首或者以s為行首的行。

2、顯示/etc/passwd文件中不以/bin/bash結尾的行?

答案:
[root@CentOS7 ~]# cat /etc/passwd | grep -v “/bin/bash$”
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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
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-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
unbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
libstoragemgmt:x:996:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
colord:x:995:994:User for colord:/var/lib/colord:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
geoclue:x:993:991:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
chrony:x:992:989::/var/lib/chrony:/sbin/nologin
setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
nologin:x:1014:1018::/home/nologin:/sbin/nologin

    其中,”/bin/bash”表示匹配”/bin/bash”字符串。

“/bin/bash”$表示匹配以”/bin/bash”字符串為行尾的行。

3、顯示用戶rpc默認的shell程序?

答案:
[root@CentOS7 ~]# cat /etc/passwd | grep “^rpc\>”
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
[root@CentOS7 ~]# cat /etc/passwd | grep “^rpc\>” | cut -d: -f7
/sbin/nologin

    其中,因為passwd文件,第一列內容為用戶,所以,需要用到^。

正則表達式rpc\>表示,匹配以rpc為單詞詞尾的內容。(\>表示單詞詞尾,$表示行尾,兩者不一樣)。

^rpc\>表示匹配以rpc單詞為行首的內容。

4、找出/etc/passwd中的兩位或三位數?
答案:
[root@CentOS7 ~]# cat /etc/passwd |grep -o “\<[0-9]\{2,3\}\>”
12
11
12
100
14
50
99
99
999
998
192
192
81
81
998
997
173
173

首先打開/etc/passwd文件,發現“root:x:0:0:root:/root:/bin/bash”,數字位為UID、GID,并且數字位前后均有“:”,所以有人可能會使用”:[0-9]\{2,3\}:”(小編就是),其實,這樣只能讀取類似于“:51:”的數字,并且只能讀取UID一列,類似于“smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin”。這種不太符合標準(如果不理解原因的話,可以查看附注1)。另外描述位上也可能有數字。所以,必須使用”\<[0-9]\{2,3\}\>”,以二位或者三位數字組成的詞語。

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行?

答案:
[root@CentOS7 app]# cat /etc/grub2.cfg |grep “^[[:space:]]\+[^[:space:]]”
  load_env
   set default=”${next_entry}”
   set next_entry=
   save_env next_entry
   set boot_once=true
   set default=”${saved_entry}”
  menuentry_id_option=”–id”
  menuentry_id_option=””
  set saved_entry=”${prev_saved_entry}”
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
  if [ -z “${boot_once}” ]; then
    saved_entry=”${chosen}”
    save_env saved_entry
  fi
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
  set timeout_style=menu
  set timeout=5
  set timeout=5
  source ${prefix}/user.cfg
  if [ -n “${GRUB2_PASSWORD}” ]; then
    set superusers=”root”
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_msdos
    insmod xfs
    set root=’hd0,msdos1′
    if [ x$feature_platform_search_hint = xy ]; then
      search –no-floppy –fs-uuid –set=root –hint-bios=hd0,msdos1 –hint-efi=hd0,msdos1 –hint-baremetal=ahci0,msdos1 –hint=’hd0,msdos1′  a655f87c-5a43-46d5-a9aa-650ffd5fd40a
    else
      search –no-floppy –fs-uuid –set=root a655f87c-5a43-46d5-a9aa-650ffd5fd40a
    fi
    linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=UUID=5dd1d7a4-ba0e-4291-aef0-a9648fc8fefe ro rhgb quiet LANG=en_US.UTF-8
    initrd16 /initramfs-3.10.0-514.el7.x86_64.img
    load_video
    insmod gzio
    insmod part_msdos
    insmod xfs
    set root=’hd0,msdos1′
    if [ x$feature_platform_search_hint = xy ]; then
      search –no-floppy –fs-uuid –set=root –hint-bios=hd0,msdos1 –hint-efi=hd0,msdos1 –hint-baremetal=ahci0,msdos1 –hint=’hd0,msdos1′  a655f87c-5a43-46d5-a9aa-650ffd5fd40a
    else
      search –no-floppy –fs-uuid –set=root a655f87c-5a43-46d5-a9aa-650ffd5fd40a
    fi
    linux16 /vmlinuz-0-rescue-e6ba125df94b4c528eaad6f794db213e root=UUID=5dd1d7a4-ba0e-4291-aef0-a9648fc8fefe ro rhgb quiet
    initrd16 /initramfs-0-rescue-e6ba125df94b4c528eaad6f794db213e.img
  source ${config_directory}/custom.cfg
  source $prefix/custom.cfg;

其中,正則表達式”^[[:space:]]\+[^[:space:]]”中,

^[[:space:]]表示以空白字符為行首;

^[[:space:]]\+表示以不止一個空白字符為行首;

[^[:space:]]表示非空白字符。(兩個^的含義不一樣?。?/span>

6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行?
答案:
[root@CentOS7 app]# netstat -tan |grep “LISTEN[[:space:]]*$”
tcp        0      0 0.0.0.0:111                     0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22                       0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631                 0.0.0.0:*               LISTEN     
tcp6      0      0 :::111                                   :::*                    LISTEN     
tcp6      0      0 :::22                                     :::*                    LISTEN     
tcp6      0      0 ::1:631                                :::*                    LISTEN

正則表達式”LISTEN[[:space:]]*$”,

其中LISTEN[[:space:]]表示字符串“LISTEN”后面跟了一個空白字符;

LISTEN[[:space:]]*表示字符串“LISTEN”后面跟了任意多個空白字符;

LISTEN[[:space:]]*$表示字符串“LISTEN”后面跟了任意多個空白字符,直到行尾,都是空白字符。

7、顯示CentOS7上所有系統用戶的用戶名和UID?
答案:
[root@CentOS7 app]# cat /etc/passwd |grep “:[1-9][0-9]\{0,2\}:” |cut -d: -f1,3
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-bus-proxy:999
systemd-network:192
dbus:81
polkitd:998
abrt:173
unbound:997
tss:59
libstoragemgmt:996
rpc:32
colord:995
usbmuxd:113
saslauth:994
geoclue:993
rtkit:172
radvd:75
rpcuser:29
qemu:107
chrony:992
setroubleshoot:991
pulse:171
gdm:42
gnome-initial-setup:990
sshd:74
avahi:70
postfix:89
ntp:38
tcpdump:72
mailnull:47
smmsp:51

CentOS7系統中,系統用戶的UID為(1-999),題目要求只要系統用戶的用戶名和UID,所以,可以使用”:[1-9][0-9]\{0,2\}:”,另外,也可以使用”\<[[:digit:]]\{1,3\}\>”$,兩個正則表達式的結果一樣。

[0-9]\{0,2\}表示0-9的數字至少0個,至多2個。

同理,[[:digit:]]\{1,3\}表示0-9的數字至少1個,至多3個。

8、添加用戶bash、testbash、basher、sh、nologin(其shell為/sbin/nologin),找出/etc/passwd用戶名同shell名的行?
答案:
[root@CentOS7 app]# useradd bash
[root@CentOS7 app]# useradd testbash
[root@CentOS7 app]# useradd basher
[root@CentOS7 app]# useradd sh
[root@CentOS7 app]# useradd nologin -s /sbin/nologin
[root@CentOS7 app]# cat /etc/passwd | grep “\(^.*\)\>.*\/\1$”
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1011:1011::/home/bash:/bin/bash
nologin:x:1015:1018::/home/nologin:/sbin/nologin
首先需要添加用戶,并且指定最后一個用戶的shell為/sbin/nologin。其中,正則表達式”\(^.*\)\>.*\/\1$”。該題用到了后向引用。一定要注意,后向引用引用的是前面的“()”中匹配到的字符。并不是“()”中的模式。(不理解的話,可以查看附屬2)。\(^.*\)表示匹配以任意字符串為行首的字符串;\(^.*\)\>.*表示匹配以任意字符串為行首,并且后面為任意字符(除了\n);\1表示“\(^.*\)”匹配到的字符串;\1$表示匹配以“\(^.*\)”匹配到的字符串為行尾;\/表示一個“/”;
\(^.*\)\>.*\/\1$表示行首行尾相同,并且,行尾所匹配的字符串前面還有一個“/”,防止出現類似于,用戶名為“sh”而起shell為“bash”的情況。
9、僅利用df和grep和sort,取出磁盤各分區利用率,并從大到小排序?
答案:
[root@CentOS7 app]# df | grep -o ” [0-9]\{1,3\}%” |sort -nr
17%
10%
1%
1%
0%
0%
0%
0%
附屬1:grep匹配的時候,例如第一行的“:051:32:”,匹配到了“:051:”后,則該行只剩下“32:”,所以,無法匹配。第二行的“:051::32:”,匹配到了“:051:”后,則該行只剩下“032:”,依然符合標準匹配。第三行同理。
[root@CentOS7 app]# cat test
:051:32:
:051::32:
:051:::32:
[root@CentOS7 app]# cat test |grep -o “:[0-9]\{2,3\}:”
:051:
:051:
:32:
:051:
:32:
屬2grep匹配的時候,第二行為“rootrootraat”,\(r..t\)匹配到“root”,那么\1就代表“root”。第三行,“rootraatraat”,當\(r..t\)匹配到“root”的時候,\1就代表“root”,但是滿足不了,所以便放棄。當\(r..t\)匹配到“raat”的時候,\1就代表“raat”,可以滿足匹配條件!
[root@CentOS7 app]# cat test
rootrootroot
rootrootraat
rootraatraat
[root@CentOS7 app]# cat test |grep -o “\(r..t\).*\1”
rootrootroot
rootroot

raatraat


作業:
1、顯示三個用戶root、mage、wang的UID和默認shell
cat /etc/passwd|grep -E “^(root|wang|mage)\>”|cut -d : -f3,7
cat /etc/passwd|grep -E -w “^(root|wang|mage)”|cut -d : -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
cat /etc/rc.d/init.d/functions | grep “^[A-Za-z_][[:alpha:]]\+(.*”
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo “/etc/rc.d/init.d/functions” | egrep -o “/[a-Z]+”$
4、使用egrep取出上面路徑的目錄名
echo “/etc/rc.d/init.d/functions” | egrep -o “^/.*/”
5、統計last命令中以root登錄的每個主機IP地址登錄次數
last | egrep “^root\>” |egrep “[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} ” | tr -s ” ” |cut -d ” ” -f 3 | sort | uniq -c
6、顯示ifconfig命令結果中所有IPv4地址
ifconfig |egrep -o “[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} “
7、將此字符串:welcome to magedu linux 中的每個字符去重并排序,重復次數多的排到前面
echo “welcome to magedu linux” |tr -d ” ” |egrep -o “.” |sort |uniq -c |sort -nr

原創文章,作者:156,如若轉載,請注明出處:http://www.www58058.com/83294

(0)
156156
上一篇 2017-07-30
下一篇 2017-07-30

相關推薦

  • vim使用方法

    vim是vi的增強版本,具有比vimi更加強大的功能,對于尤其適合編寫腳本,下面總結一下vim的常用方法。 vim三種工作模式。         1. 編輯模式:          &nbs…

    2015-03-18
  • M22 xfs文件系統命令總結

    Centos6.0及之前的默認文件系統是ext系列的,而在最新的Centos7上卻使用了xfs作為默認的文件系統。在Centos7中xfs文件系統包括如下命令: xfs_admin:修改xfs文件系統的參數,需要先卸載分區 用法:xfs_admin [ -eflpu ] [ -c 0|1 ] [ -L label ] [ -U uuid ] device x…

    Linux干貨 2017-03-16
  • Linux 的shell腳本編程

    shell腳本編程 程序:指令+數據 程序編輯風格:             過程式:以指令為中心,數據服務于指令             對象式:以數據為中心,指令服務于數據 shell程序:提供了編程能力,解釋執行 計算機:運行二進制指…

    Linux干貨 2016-08-15
  • 做有高薪有逼格的運維工程師,不會Linux是沒有前途的!

    作為互聯網的幕后英雄,運維工程師長期隱匿在大眾認知范圍之外,關于運維的討論仍舊是一片無人涉足的荒漠。在某知名行業研究調查結果中,非互聯網從業者對于運維相關問題的回復有三個高頻詞匯是:不知道、沒聽過、網管。當調查人員告訴他們科幻電影中展示黑客高超技巧時的命令行界面正是大多數運維工程師每日工作環境時,他們發出極其一致的驚嘆。 相對于普羅大眾的一無所知,技術圈對運…

    2017-09-08
  • 二叉樹迭代器算法

    二叉樹(Binary Tree)的前序、中序和后續遍歷是算法和數據結構中的基本問題,基于遞歸的二叉樹遍歷算法更是遞歸的經典應用。 假設二叉樹結點定義如下: // C++ struct Node {     int value;     No…

    Linux干貨 2016-08-15
  • MySQL入門命令知識

    簡單介紹下吧,MySQL應用的場景大多數互聯網公司第一次賣身是賣個了sun好像是10億,第二次是連同sun自己,以74億美元被賣給了Orecle~后面MySQL原作者站出來說,MySQL會存在閉源風險,整了個MariaDB~我也是醉了,也不考慮下我們的痛苦!下面簡要介紹下MySQL的入門知識。    一、MySQL有三種定義語言 &nbs…

    2016-12-05
欧美性久久久久