linux find 正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux find 正则表达式相关的知识,希望对你有一定的参考价值。
问题1:
find 0?
?不是应该匹配0这个文件吗?为啥会出来01和0s....................
问题2:
find 0.
.不是应该匹配一个字符吗?为啥啥都没找到?
问题3:
为什么什么提示都没....
谢谢了....
find 0?
0?代表的是要查找的路径, 意思是在0?这个路径下查找. bash的?匹配任意一个字符,这里0?匹配到了01和0s. 在01和0s下查找文件,返回了01 0s.
2:
find 0.
在0.下查找,bash里.就是字符'.' ,因为没有0.这个文件, 所以报上面的错误.
3.
find ./ -regex "0."
在当前目录查找匹配正则0.的文件, -regex的正则"0." 使用的是emacs的正则, 匹配0后面跟一个字符. 错误是在于-regex的正则表达式必须匹配整个路径, 文件名前的路径"./"也需要匹配. 可以这样写
find ./ -regex "./0." 参考技术A * >=0 次*前面的字符
. 任意1个任意字符
? 0或1个?前面的字符
+ >=1个+前面的字符
.* 任意个任意字符
\n\ 表示前面的字符出现n次 egrep 不用写脱义字符n
\n,\ 表示前面的字符出现不小于n次
\n,m\ 表示前面的字符出现n到m次 参考技术B linux 不是标准正则表达,是伪正则
*才是任意数目的任意字符
?代表一个任意字符 #第一个问题
点就仅仅是点 #第二个问题 vi 0. 创建一个0. 的文件 就能找到0.的文件
点就是点,没有特殊含义#第三个问题,改成*
############在linux下
推荐是经常使用man这个命令
man find 参考技术C find命令不是这样用的啊 ,
find可以所搜文件名
私信过来
马哥2016全新Linux+Python高端运维班-Linux grep正则表达式练习,及find命令
本周作业内容:
1、显示当前系统上root、fedora或user1用户的默认shell;
[[email protected] home]# 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();
[[email protected] /]# 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取出其基名;
[[email protected] /]# echo "/tmp/ljohn/useradd.sh" | grep -E -o "[^/]+$" useradd.sh [[email protected] ~]# echo "/tmp/ljohn/useradd.sh/" |grep -Eo "[^/]+/?$" |cut -d‘/‘ -f1 useradd.sh
#基名basename /tmp/ljohn/useradd.sh
[[email protected] ~]# basename /tmp/ljohn/useradd.sh useradd.sh [[email protected] ~]# basename /tmp/ljohn/useradd.sh/ useradd.sh
#这样可以看出第二种同basename命令。 #行尾的字符串[^/]除了/斜线的任意内容,+代表这个/至少出现1次 #$:表示行尾锚定
扩展:取出其路径名
[[email protected] /]# echo "/tmp/ljohn/useradd.sh" | grep -E -o "^/.*/" /tmp/ljohn/ [[email protected] ~]# echo "/tmp/ljohn/useradd.sh" |grep -Eo "^/.*/" |grep -Eo "^/.*[^/]" /tmp/ljohn #目录名dirname /tmp/ljohn/useradd.sh [[email protected] ~]# dirname /tmp/ljohn/useradd.sh /tmp/ljohn [[email protected] ~]# dirname /tmp/ljohn/useradd.sh/ /tmp/ljohn
#这样可以看出第二种同dirname命令 #^/.*/ 表示以/开头,中间任意长度字符,以/结尾。 #.*:任意长度的任意字符 #[^/]:除了斜线的任意内容
4、找出ifconfig命令结果中的1-255之间数字;
[[email protected] /]# 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
[[email protected] /]# 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、挑战题:写一个模式,能匹配出所有的邮件地址;
[[email protected] /]# cat /tmp/mail.txt [email protected] [email protected] [email protected] [email protected]_cmd.cn [email protected] lkjdas_#@123_.com [[email protected] /]# grep -E "^[[:alnum:]][email protected][[:alnum:]]+\.[[:alnum:]]+$" /tmp/mail.txt [email protected] [email protected] [email protected] [email protected] #先创建了一个mail.txt的文件事先编辑了几个邮箱 #首先要了解邮箱的格式:数字字母@数字字母.数字字母 #[[:alnum:]]+ 表示任意数字或字母
7、查找/var目录下属主为root,且属组为mail的所有文件或目录;
[[email protected] ~]# find /var -user root -group mail -ls 262296 4 drwxrwxr-x 2 root mail 4096 9月 4 15:35 /var/spool/mail 262048 4 -rw------- 1 root mail 2353 9月 3 17:33 /var/spool/mail/root #find命令格式:find [OPTION]... [查找路径] [查找条件] [处理动作] #find命令实现对属主,数组的匹配,使用-user 和-group来实现。
8、查找当前系统上没有属主或属组的文件;
[root[email protected] ~]# 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天内曾被访问过的文件或目录;
[[email protected] ~]# 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目录下所有用户都有写权限的文件;
[[email protected] ~]# 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,且类型为普通文件的所有文件;
[[email protected] ~]# find /etc/ -type f -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/目录下,所有用户都有执行权限,且其它用户有写权限的文件;
[[email protected] ~]# find /etc/init.d -perm -113 -ls 652914 0 lrwxrwxrwx 1 root root 11 2月 12 2015 /etc/init.d -> rc.d/init.d
12、查找/usr目录下不属于root、bin或hadoop的文件;
[[email protected] ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls 20956 8 -rwsr-xr-x 1 abrt abrt 6700 11月 23 2013 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache 或者: [[email protected] ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls 20956 8 -rwsr-xr-x 1 abrt abrt 6700 11月 23 2013 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
13、查找/etc/目录下至少有一类用户没有写权限的文件;
[[email protected] ~]# find /etc -not -perm -222 -ls 652802 12 drwxr-xr-x 118 root root 12288 9月 4 15:35 /etc 652826 0 -rw-r--r-- 1 root root 0 1月 12 2010 /etc/exports 661961 4 drwxr-xr-x 2 root root 4096 8月 30 23:52 /etc/glances 662033 4 -rw-r--r-- 1 root root 3288 1月 18 2014 /etc/glances/glances.conf
...
14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件;
创建一个文件并修改权限:
[[email protected] etc]# cat > findtest.txt <<EOF > 123123 > Hello!! > How are you ! > EOF [[email protected] etc]# chown liu.liu findtest.txt [[email protected] etc]# ls -l findtest.txt -rw-r--r--. 1 liu liu 29 9月 5 05:07 findtest.txt [[email protected] etc]# find /etc -mtime -7 -not -user root -not -user hadoop /etc/findtest.txt
本文出自 “Ljohn” 博客,请务必保留此出处http://ljohn.blog.51cto.com/11932290/1846386
以上是关于linux find 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
linux--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)