全新Linux+Python高端运维班-Linux grep正则表达式练习,及find命令
本周作业内容: 1、显示当前系统上root、fedora或user1用户的默认shell; 1 2 3 4 5 6 7 [root@liuhome] #grep-E"^(root|fedora|user1)\>"/etc/passwd|cut-d:-f1,7 root: /bin/bash user1: /bin/bash fedora: /bin/bash #本题使用扩展的正则表达式 #^:首行|:或者():将一个或者多个字符捆绑在一起当作一个整体来处理\>:表示词尾定锚定 #cut-d:f1,7表示用:号作为分隔符,截取第1字段和第7个字段.分别代表用户名和默认的登陆shell 2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [root@liu/] #grep-E-o"[_[:alpha:]]+\(\)"/etc/rc.d/init.d/functions fstab_decode_str() checkpid() __readlink() __fgrep() __umount_loop() __umount_loopback_loop() __pids_var_run() __pids_pidof() daemon() killproc() pidfileofproc() pidofproc() status() echo_success() echo_failure() echo_passed() echo_warning() update_boot_stage() success() failure() passed() warning() action() strstr() confirm() get_numeric_dev() is_ignored_file() is_true() is_false() apply_sysctl() key_is_random() find_crypto_mount_point() init_crypto() #使用grep-E或者egrep扩展正则表达式,-o表示只匹配到符合的字符 #[_[:alpha:]]表示以_或者大小写字母开头的字符;+表示前面的字符出现一次或多次; #要匹配包含()的行,在过滤时需要对小括号进行转义:\(\) 3、使用echo命令输出一个绝对路径,使用grep取出其基名; 1 2 3 4 [root@liu/] #echo"/tmp/ljohn/useradd.sh"|grep-E-o"[^/]+$" useradd .sh [root@liu~] #echo"/tmp/ljohn/useradd.sh/"|grep-Eo"[^/]+/?$"|cut-d'/'-f1 useradd .sh #基名basename /tmp/ljohn/useradd.sh 1 2 3 4 [root@liu~] #basename/tmp/ljohn/useradd.sh useradd .sh [root@liu~] #basename/tmp/ljohn/useradd.sh/ useradd .sh 1 2 3 #这样可以看出第二种同basename命令。 #行尾的字符串[^/]除了/斜线的任意内容,+代表这个/至少出现1次 #$:表示行尾锚定 扩展:取出其路径名 1 2 3 4 5 6 7 8 9 [root@liu/] #echo"/tmp/ljohn/useradd.sh"|grep-E-o"^/.*/" /tmp/ljohn/ [root@liu~] #echo"/tmp/ljohn/useradd.sh"|grep-Eo"^/.*/"|grep-Eo"^/.*[^/]" /tmp/ljohn #目录名dirname/tmp/ljohn/useradd.sh [root@liu~] #dirname/tmp/ljohn/useradd.sh /tmp/ljohn [root@liu~] #dirname/tmp/ljohn/useradd.sh/ /tmp/ljohn 1 2 3 4 #这样可以看出第二种同dirname命令 #^/.*/表示以/开头,中间任意长度字符,以/结尾。 #.*:任意长度的任意字符 #[^/]:除了斜线的任意内容 4、找出ifconfig命令结果中的1-255之间数字; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [root@liu/] #ifconfig|grep-E-o"\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\>"|sort -n-u 5 8 19 20 29 30 31 38 39 41 42 45 64 100 127 128 137 150 164 168 192 255 #[1-9]表示1-9;[1-9][0-9]表示10-99;1[0-9][0-9]表示100-199;2[0-9][0-9])表示200-299 #使用-o参数表示只显示匹配到的字符; #sort-n-u按数字大小排序并去重; 5、挑战题:写一个模式,能匹配合理的IP地址; # A类地址范围:1.0.0.1—126.255.255.254 B类地址范围:128.0.0.1—191.255.255.254 # C类地址范围:192.0.0.1—223.255.255.254 D类地址范围:224.0.0.1—239.255.255.254 # E类地址范围:240.0.0.1—255.255.255.254 127.X.X.X是保留地址,用做循环测试用的 # 匹配范围为 1-255.0-255.0-255.1-254 1 2 3 [root@liu/] #ifconfig|grep-E-o"(2[0-5]{2}|1[0-9]{2}|[1-9][0-9]|[1-9])\.((2[0-5]{2}|1[0-9]{2}|[1-9][0-9]|[0-9])\.){2}\<(2[0-5][0-4]|1[0-9]{2}|[1-9][0-9]|[1-9])\>" 192.168.137.30 127.0.0.1 #此题参考http://ld0381.blog.51cto.com/3318114/1845601; http://2368360.blog.51cto.com/2358360/1846091 #详细解析: ^PATTERN$ 用于模式匹配整行 {2}表示前面字符正好出现两次 | 的意思是或者 ( )上面的括号不能少,是为了匹配括号中整体字符串,表达式中有几个()就表示有几个相应的匹配字符串 [0-4]表示0~4的任何一个数字 [0-9]表示0~9的任何一个数字 [1-9]的意思是1~9之间的任意一个数字 [1-9][0-9]的意思是10~99之间的任意一个数字 1[0-9]{2}的意思就是100~199之间的任意一个数字 2[0-4][0-9]的意思是200~249之间的任意一个数字 25[0-5]的意思是250~255之间的任意一个数字 \.的意思是.点要转义为普通字符 6、挑战题:写一个模式,能匹配出所有的邮件地址; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@liu/] #cat/tmp/mail.txt 184694637@qq.com lshailkj@qq.com ljohnmail@foxmail.com foxmail@_cmd.cn ljohn@163.com lkjdas_ #@123_.com [root@liu/] #grep-E"^[[:alnum:]]+@[[:alnum:]]+\.[[:alnum:]]+$"/tmp/mail.txt 184694637@qq.com lshailkj@qq.com ljohnmail@foxmail.com ljohn@163.com #先创建了一个mail.txt的文件事先编辑了几个邮箱 #首先要了解邮箱的格式:数字字母@数字字母.数字字母 #[[:alnum:]]+表示任意数字或字母 7、查找/var目录下属主为root,且属组为mail的所有文件或目录; 1 2 3 4 5 [root@liu~] #find/var-userroot-groupmail-ls 2622964drwxrwxr-x2rootmail40969月415:35 /var/spool/mail 2620484-rw-------1rootmail23539月317:33 /var/spool/mail/root #find命令格式:find[OPTION]...[查找路径][查找条件][处理动作] #find命令实现对属主,数组的匹配,使用-user和-group来实现。 8、查找当前系统上没有属主或属组的文件; 1 2 3 4 5 6 7 8 9 10 11 [root@liu~] #find/-nouser-o-nogroup /home/mandirva /home/mandirva/ .gnome2 /home/mandirva/ .bashrc /home/mandirva/ .mozilla /home/mandirva/ .mozilla /plugins /home/mandirva/ .mozilla /extensions /home/mandirva/ .bash_logout /home/mandirva/ .bash_profile /var/spool/mail/mandirva #-nouser没有属主;-nogroup没有数组 进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录; 1 2 3 4 5 6 7 8 9 10 [root@liu~] #find/\(-nouser-o-nogroup\)-atime-3 find :“ /proc/3759/task/3759/fd/5 ”:没有那个文件或目录 find :“ /proc/3759/task/3759/fdinfo/5 ”:没有那个文件或目录 find :“ /proc/3759/fd/5 ”:没有那个文件或目录 find :“ /proc/3759/fdinfo/5 ”:没有那个文件或目录 /home/mandirva /home/mandirva/ .gnome2 /home/mandirva/ .mozilla /home/mandirva/ .mozilla /plugins /home/mandirva/ .mozilla /extensions 9、查找/etc目录下所有用户都有写权限的文件; 1 2 3 4 5 6 7 [root@liu~] #find/etc-perm-222 /etc/rc .d /rc1 .d /K73winbind /etc/rc .d /rc1 .d /K92iptables /etc/rc .d /rc1 .d /K99rngd /etc/rc .d /rc1 .d /K84wpa_supplicant /etc/rc .d /rc1 .d /K89portreserve ... #根据权限查找: -perm [+|-]MODE MODE: 精确权限匹配 +MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可; -MODE:每一类对象都必须同时拥有为其指定的权限标准; -222:表示每一个用户都有写权限。 10、查找/etc目录下大于1M,且类型为普通文件的所有文件; 1 2 3 4 [root@liu~] #find/etc/-typef-size+1M /etc/selinux/targeted/modules/active/policy .kern /etc/selinux/targeted/policy/policy .24 /etc/gconf/gconf .xml.defaults/%gconf-tree.xml #根据类型查找: -type TYPE: f: 普通文件 d: 目录文件 l: 符号链接文件 s:套接字文件 b: 块设备文件 c: 字符设备文件 p: 管道文件 #根据文件大小查找: -size [+|-]#UNIT 常用单位:k, M, G #UNIT: (#-1, #] -#UNIT:[0,#-1] +#UNIT:(#,oo) 11、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件; 1 2 [root@liu~] #find/etc/init.d-perm-113-ls 6529140lrwxrwxrwx1rootroot112月122015 /etc/init .d->rc.d /init .d 12、查找/usr目录下不属于root、bin或hadoop的文件; 1 2 3 4 5 [root@liu~] #find/usr-not\(-userroot-o-userbin-o-userhadoop\)-ls 209568-rwsr-xr-x1abrtabrt670011月232013 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache 或者: [root@liu~] #find/usr-not-userroot-a-not-userbin-a-not-userhadoop-ls 209568-rwsr-xr-x1abrtabrt670011月232013 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache 13、查找/etc/目录下至少有一类用户没有写权限的文件; 1 2 3 4 5 [root@liu~] #find/etc-not-perm-222-ls 65280212drwxr-xr-x118rootroot122889月415:35 /etc 6528260-rw-r--r--1rootroot01月122010 /etc/exports 6619614drwxr-xr-x2rootroot40968月3023:52 /etc/glances 6620334-rw-r--r--1rootroot32881月182014 /etc/glances/glances .conf ... 14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件; 创建一个文件并修改权限: 1 2 3 4 5 6 7 8 9 10 [root@liuetc] #cat>findtest.txt<<EOF >123123 >Hello!! >Howareyou! >EOF [root@liuetc] #chownliu.liufindtest.txt [root@liuetc] #ls-lfindtest.txt -rw-r--r--.1liuliu299月505:07findtest.txt [root@liuetc] #find/etc-mtime-7-not-userroot-not-userhadoop /etc/findtest .txt 本文转自 ljohnmail 51CTO博客,原文链接:http://blog.51cto.com/ljohn/1846386,如需转载请自行联系原作者