根据作业浅析正则表达式

来源:互联网 发布:2017好用的网络硬盘 编辑:程序博客网 时间:2024/06/06 04:46

什么是正则?正则就是,那种体现出某种规律的不变性或者对称性的物理量或关系。
正则表达式(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/meminfoSwapCached:            0 kBSwapTotal:          2044 kBSwapFree:           2044 kBShmem:              9108 kBSlab:              65388 kBSReclaimable:      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/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:998:997:User for polkitd:/:/sbin/nologinabrt:x:173:173::/etc/abrt:/sbin/nologinunbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologinlibstoragemgmt:x:996:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologinrpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologincolord:x:995:994:User for colord:/var/lib/colord:/sbin/nologinusbmuxd:x:113:113:usbmuxd user:/:/sbin/nologinsaslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologingeoclue:x:993:991:User for geoclue:/var/lib/geoclue:/sbin/nologinrtkit:x:172:172:RealtimeKit:/proc:/sbin/nologinradvd:x:75:75:radvd user:/:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinqemu:x:107:107:qemu user:/:/sbin/nologinchrony:x:992:989::/var/lib/chrony:/sbin/nologinsetroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologinpulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologingdm:x:42:42::/var/lib/gdm:/sbin/nologingnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinavahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinmailnull:x:47:47::/var/spool/mqueue:/sbin/nologinsmmsp:x:51:51::/var/spool/mqueue:/sbin/nologinnologin: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\}\>"121112100145099999999981921928181998997173173首先打开/etc/passwd文件,发现“root:x:0:0:root:/root:/bin/bash”,数字位为UIDGID,并且数字位前后均有“:”,所以有人可能会使用":[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:]]表示非空白字符。(两个^的含义不一样!)

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,3bin:1daemon:2adm:3lp:4sync:5shutdown:6halt:7mail:8operator:11games:12ftp:14nobody:99systemd-bus-proxy:999systemd-network:192dbus:81polkitd:998abrt:173unbound:997tss:59libstoragemgmt:996rpc:32colord:995usbmuxd:113saslauth:994geoclue:993rtkit:172radvd:75rpcuser:29qemu:107chrony:992setroubleshoot:991pulse:171gdm:42gnome-initial-setup:990sshd:74avahi:70postfix:89ntp:38tcpdump:72mailnull:47smmsp:51CentOS7系统中,系统用户的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/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:1011:1011::/home/bash:/bin/bashnologin: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 -nr17%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:

附属2:grep匹配的时候,第二行为“rootrootraat”,(r..t)匹配到“root”,那么\1就代表“root”。第三行,“rootraatraat”,当(r..t)匹配到“root”的时候,\1就代表“root”,但是满足不了,所以便放弃。当(r..t)匹配到“raat”的时候,\1就代表“raat”,可以满足匹配条件!

[root@CentOS7 app]# cat testrootrootrootrootrootraatrootraatraat[root@CentOS7 app]# cat test |grep -o "\(r..t\).*\1"rootrootrootrootrootraatraat

作业:
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

原创粉丝点击