正则表达式
文本搜索:grep,根据用户指定的模式对目标进行过滤,显示被匹配到的行(标准的模式要"") 使用格式:grep 选项 模式 文件名 (与文件通配不一样,只要包含该模式即可,输出的就是一行) 选项及其作用: -o 仅显示匹配到的内容,不会整行输出 -v 把没有匹配到的内容显示出来 -i 忽略匹配模式的大小写 -e 使用的是扩展的正则表达式 -A # 将匹配到的内容及其向下#行显示出来 -B # 将匹配到的内容及其向上#行显示出来 -C # 将匹配到的内容及其上下#行显示出来 模式:由一类字符书写的模式,其中有一些字符不表示字符字面的意思,而是标示通配功能 [root@localhosttmp]#grep"/bin/bash"/etc/passwd root:x:0:0:root:/root:/bin/bash mml:x:65530:0:klkjljk:/home/mml:/bin/bash [root@localhosttmp]#grep-o"/bin/bash"/etc/passwd /bin/bash /bin/bash [root@localhosttmp]#grep-v"/bin/bash"/etc/passwd 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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin [root@localhosttmp]#grep-i"/BIN/bash"/etc/passwd root:x:0:0:root:/root:/bin/bash mml:x:65530:0:klkjljk:/home/mml:/bin/bash [root@localhosttmp]#cat-n/etc/group 1bin:x:1:bin,daemon 2daemon:x:2:bin,daemon 3sys:x:3:bin,adm 4adm:x:4:adm,daemon 5tty:x:5: [root@localhosttmp]#grep-C1"&;sys&;"/etc/group daemon:x:2:bin,daemon sys:x:3:bin,adm adm:x:4:adm,daemon 基本正则表达式的元字符: . 匹配任意单个字符 [] 匹配指定集合内的任意单个字符 数字集合:[0-9];[:digit:] 小写字母集:[a-z];[:lower:] 大写字母集:[A-Z];[:upper:] 大小写字母集:[a-zA-Z];[:alpha:] 数字和大小写字母集:[0-9a-zA-Z];[[:alnum:]] 空白字符集[[:space:]] [^]匹配集合外的任意单个字符 * 匹配其前面的字符任意次数 ? 匹配其前面字符0次或一次 + 匹配其前面字符至少一次 {m} 匹配其前面字符m次 {m,n} 匹配其前面字符出现至少m次,之多n次 位置锚定:^ 行首锚定 $ 行尾锚定 ^$ 空白行,什么都没有,不是空格符 &; 词首锚定 &; 词尾锚定 分组: (需要分成一组的内容) 选择字符: | 继承上次命令的参数: esc+. 后项引用:“([0-9])([a-z])12” 以数字开头,小写字母结尾的词 在基本正则表达式中不能直接识别字符,需要“|”进行转义 练习: 1、显示/proc/meminfo文件中以大写或小写S开头的行: [root@localhosttmp]#grep^[Ss]/proc/meminfo SwapCached:0kB SwapTotal:2031612kB SwapFree:2031612kB Shmem:228kB Slab:36100kB SReclaimable:11268kB SUnreclaim:24832kB 2、显示/etc/passwd文件中其默认shell为/sbin/nologin的用户: 在文件/etc/passwd中,以“:”为分割,shell类型在第七字段,用户在第一字段,所以: [root@localhosttmp]#grep"/sbin/nologin"/etc/passwd|cut-d:-f1 bin daemon adm lp mail uucp operator games gopher ftp (下面的也显示了shell类型) [root@localhosttmp]#grep"/sbin/nologin"/etc/passwd|cut-d:-f1,7 bin:/sbin/nologin daemon:/sbin/nologin adm:/sbin/nologin lp:/sbin/nologin mail:/sbin/nologin uucp:/sbin/nologin operator:/sbin/nologin games:/sbin/nologin gopher:/sbin/nologin ftp:/sbin/nologin 3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;进一步仅显示上述结果中其ID号最大的用户: [root@localhosttmp]#grep"/bin/bash$"/etc/passwd|sort-t:-k3|cut-d:-f1|tail-1 mml [root@localhosttmp]#grep"/bin/bash$"/etc/passwd|sort-t:-k3|tail-3 root:x:0:0:root:/root:/bin/bash mml:x:65530:0:klkjljk:/home/mml:/bin/bash 4、找出/etc/passwd文件中的一位数或两位数; [root@localhosttmp]#grep--color"&;[0-9]&;|&;[0-9][0-9]&;"/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin 或者 [root@localhosttmp]#grep--color"(&;[0-9]&;)|(&;[0-9][0-9]&;)"/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin 或者 [root@localhosttmp]#grep--color"&;[0-9]{1,2}&;"/etc/passwd root:x:0:0:root:/root:/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 saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin 5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhosttmp]#grep"^[[:space:]]+"/boot/grub/grub.conf root(hd0,0) kernel/vmlinuz-2.6.32-504.el6.x86_64roroot=/dev/mapper/VolGroup-lv_rootrd_NO_LUKSLANG=en_US.UTF-8rd_NO_MDrd_LVM_LV=VolGroup/lv_swapSYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=VolGroup/lv_rootKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquiet initrd/initramfs-2.6.32-504.el6.x86_64.img 6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字 符的行;(可以分组"(^#[[:space:]]+[^[:space:]]+)",但不能锁定单词"&;^#[[:space:]]+[^[:space:]]+&;") [root@localhosttmp]#grep"^#[[:space:]]+[^[:space:]]+"/etc/rc.d/rc.sysinit #/etc/rc.d/rc.sysinit-runonceatboottime #TakeninpartfromMiquelvanSmoorenburg'sbcheckrc. #CheckSELinuxstatus #Printatextbanner. #Onlyreadthisonce. 7、找出netstat -tan命令执行结果中以'LISTEN'(后可有空白字符)结尾的行; (注意次数) [root@localhosttmp]#netstat-tan|grep"LISTEN[[:space:]]*$" tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:6310.0.0.0:*LISTEN tcp00127.0.0.1:250.0.0.0:*LISTEN tcp000.0.0.0:345400.0.0.0:*LISTEN tcp000.0.0.0:1110.0.0.0:*LISTEN tcp00:::22:::*LISTEN tcp00::1:631:::*LISTEN tcp00::1:25:::*LISTEN tcp00:::45646:::*LISTEN tcp00:::111:::*LISTEN [root@localhosttmp]#netstat-tan|cat-e ActiveInternetconnections(serversandestablished)$ ProtoRecv-QSend-QLocalAddressForeignAddressState$ tcp000.0.0.0:220.0.0.0:*LISTEN$ tcp00127.0.0.1:6310.0.0.0:*LISTEN$ 8、添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名 和默认shell相同的用户;(注意模式的表达格式) [root@localhosttmp]#useradd-s/sbin/nologinbash [root@localhosttmp]#useradd-s/sbin/nologintestbash [root@localhosttmp]#useradd-s/sbin/nologinbasher [root@localhosttmp]#useradd-s/sbin/nologinnologin [root@localhosttmp]#tail-5/etc/passwd mml:x:65530:0:klkjljk:/home/mml:/bin/bash bash:x:500:500::/home/bash:/sbin/nologin testbash:x:501:501::/home/testbash:/sbin/nologin basher:x:502:502::/home/basher:/sbin/nologin nologin:x:503:503::/home/nologin:/sbin/nologin [root@localhosttmp]#grep"^(&;[[:alpha:]]*&;).*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:503:503::/home/nologin:/sbin/nologin 9、扩展题:新建一个文本文件,假设有如下内容: (观察其不同) [root@localhosttmp]#grep-o--color".*(&;[[:lower:]]*&;).*1r"bb helikehisliker helovehislover [root@localhosttmp]#grep--color'(&;[[:alpha:]]+&;).*1r'bb helikehisliker; helovehislover. 扩展正则表达式 命令格式:egrep 选项 模式 文件名 -o 仅显示匹配到的内容,不会整行输出 -v 把没有匹配到的内容显示出来 --color 加色显示匹配到的内容 -i 忽略匹配模式的大小写 -A #将匹配到的内容及其向下#行显示出来 -B #将匹配到的内容及其向上#行显示出来 -C #将匹配到的内容及其上下的#行显示出来 扩展正则表达式的元字符(与基本的基本相似): . 匹配任意单个字符 [] 匹配指定集合内的任意单个字符 数字集合:[0-9];[:digit:] 小写字母集:[a-z];[:lower:] 大写字母集:[A-Z];[:upper:] 大小写字母集:[a-zA-Z];[:alpha:] 数字和大小写字母集:[0-9a-zA-Z];[[:alnum:]] 空白字符集[[:space:]] [^]匹配集合外的任意单个字符 * 匹配其前面的字符任意次数 ? 匹配其前面字符0次或一次 + 匹配其前面字符至少一次 {m} 匹配其前面字符m次 {m,n} 匹配其前面字符出现至少m次,之多n次 位置锚定:^ 行首锚定 $ 行尾锚定 ^$ 空白行,什么都没有,不是空格符 < 词首锚定 > 词尾锚定 分组: (需要分成一组的内容) 选择字符: | 继承上次命令的参数: esc+. 后项引用:“([0-9])([a-z])12” 以数字开头,小写字母结尾的词 扩展正则表达式可以直接识别字符,不需要“|”进行转义 基名:路径的最后一个(不管是目录还是文件) dirname命令:获取路径名 basename命令:获取基名 练习10:显示当前系统上root、centos或user1用户的默认shell及用户名; [root@localhosttmp]#grep"(^&;root&;|^&;centos&;|^&;user1&;)"/etc/passwd|cut-d:-f1,7 root:/bin/bash 练习11:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行; [root@localhosttmp]#grep"(&;[[:alpha:]]+&;())"/etc/rc.d/init.d/functions checkpid(){ daemon(){ killproc(){ pidfileofproc(){ pidofproc(){ status(){ success(){ failure(){ passed(){ warning(){ action(){ strstr(){ confirm(){ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |