Linux四剑客及正则表达式

打印 上一主题 下一主题

主题 1036|帖子 1036|积分 3108

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正则表达式



  • 基础正则(利用四剑客命令时无需加任何参数即可利用)
  1. ^    # 匹配以某一内容开头 如:'^grep'匹配所有以grep开头的行。   
  2. $    # 匹配以某一内容结尾 如:'grep$' 匹配所有以grep结尾的行。
  3. ^$         # 匹配空行。
  4. .    # 匹配任意单个字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。   
  5. *    # 前一个字符出现0次及0次以上 如:'a*'匹配所有有a的行。
  6. .*   # 表示文件中所有内容。
  7. []   # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
  8. [^]  # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头的行
  9.          注意:在[]中,除位置在第一个字符的^外,其余任何带含义的特殊符号都会被还原。
复制代码


  • 扩展正则

    • 利用方法
    1. grep命令:
    2.                 grep -E ……                或egrep ……
    3. sed命令:
    4.                 sed -r ……
    5. awk命令:
    6.                 awk -E ……
    复制代码
      

    • 表达式
    1. +                #匹配前一个字符连续出现1次或1次以上 如:'a+' 匹配字符a连续出现1次或多次的行。
    2.                 注:通常与[]配合使用,过滤连续的内容。
    3. {n,m}        #匹配前一个字符至少n次,最多m次,优先匹配后面的数字
    4.                 例:'[0-9]{18}'        匹配连续的18个数字
    5. |                #或者
    6.                 例:'^$|^#'        匹配文件的空行或以井号开头的
    7. ()                #表示一个整体;反向引用/后向引用
    复制代码

  • 单词边界符
  1. \b            # 单词锁定符,如: '\bgrep\b'只匹配grep;'\b[0-9]{18}\b'只匹配连续的18位数字
  2. \<            # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。   
  3. \>            # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
  4. \<……\>        # 相当于\b...\b
  5. \w      # 匹配文字和数字字符,也就是[A-Za-z0-9];
  6. \W      # \w的反置形式,匹配一个或多个非单词字符,相当于[^A-Za-z0-9]
复制代码
四剑客

find 在指定目次下查找文件

语法情势
  1. find [参数] [选项]                                           #单条件查找
  2. find [参数] [选项] [or/and] [选项]          #多条件查找
复制代码
or/and
  1. #使用find命令可以多条件查找;
  2. -a                        #需要同时满足两个、多个条件时(and可以省略);
  3. -o                        #只需满足其中之一条件时;
复制代码
选项
  1. -type f/d/l/b/c                                #按照文件类型查找;
  2. -name "NAME"                                #按照文件名字查找;
  3. -iname "NAME"                                #按照文件名字查找(忽略大小写);
  4. -inum "INUM"                                #按照文件iNode号查找;
  5. -maxdepth n                                        #按照深度等级查找(向下遍历);
  6. -size +n/-n/n                                #按照文件大小查找;
  7. -mtime +n/-n/n                                #按照文件修改时间查找;当n=0,代表24小时内被修改过的文件;
复制代码
示例
  1. #查找/目录下文件名为dezyan.txt的文件(不区分大小写)
  2. [root@Dezyan ~]# find / -iname "dezyan.txt"
  3. /proc/kcore
  4. #查找/目录下文件大小大于1M的目录
  5. [root@Dezyan ~]# find / -size +1M -type d
  6. 注意:当一个目录大小大于1M,说明该目录中存在非常多的小文件
  7. #查找/目录下的字符设备或块设备文件
  8. [root@Dezyan ~]# find / -type c -o -type b
  9. 或        find / -type c,b
  10. #以深度等级为1查找/目录下以.log结尾的文件
  11. [root@Dezyan ~]# find / -maxdepth 1 -name "*.log" -type f
  12. #查找24小时内被修改过的文件
  13. [root@Dezyan ~]# find ./ -mtime 0
复制代码
xargs 给其他命令传递参数的一个过滤器

注意:在xargs后别名失效
语法情势
  1. find …………        | xargs [文件操作,命令]
  2. #可以理解为将|前执行的结果甩到末尾,再执行|后的命令
复制代码
相关利用方法
  1. -n1                                         #按照第一列方式输出内容
  2. ls -l/cat                         #查看找到的文件;
  3. rm [选项]                                #将查找的文件删除;
  4. -i cp/mv {} [参数]        #将查找到的文件复制/移动到[参数位置];
  5. cp/mv -t [参数]                #将查找到的文件复制/移动到[参数位置];
复制代码
示例
  1. #将/etc/下大于9M的文件复制到~目录下
  2. [root@Dezyan ~]# find /etc/ -size +9M | xargs cp -t ~
  3. [root@Dezyan ~]# ls ~ | grep 'hwd'
  4. hwdb.bin
  5. #查找出所有大写的.TXT结尾的文件 然后打包成test.tar.gz
  6. [root@Dezyan ~]# find ./ -name "*.TXT"|xargs tar zcvf a.tar.gz
复制代码
exec 调用并执行指定的命令

注意:利用exec将多个文件压缩成一个压缩包是不可取的,由于按照exec的逻辑,是将前一命令的每一次执行结果依次放入{},进行压缩时,会不断覆盖文件;
语法情势
  1. find …………        -exec [命令] {} [参数] \;
复制代码
注意:其中==;==为shell中命令的分隔符,可将多个命令同时执行:mkdir test;touch 1.txt。
相关利用方法
  1. rm [选项] {} \;                #将查找的文件删除;
  2. cp/mv {} [参数] \;        #将查找到的文件复制/移动到[参数位置];
复制代码
示例
  1. #将/etc/下大于9M的文件复制到~目录下
  2. [root@Dezyan ~]# find /etc/ -size +9M -exec  cp {} ~ \;
复制代码
利用``和$()

语法情势
  1. [命令+选项] `find ……………`
  2. [命令+选项] `find ……………` [参数]
复制代码
$()效果与``相同
注意:假如一段命令被添加上了``,那么在团体命令中,必要先执行``中的命令,雷同于运算法则中的加减乘除先算()。
相关利用方法
  1. cp/mv `find ……` [参数]
  2. ls/rm……
复制代码
示例
  1. #将/etc/下大于9M的文件复制到~目录下
  2. [root@Dezyan ~]# cp -a `find /etc/ -size +9M` ~
复制代码
grep 强大的文本搜索工具

语法情势
  1. grep [选项] '[word]' [参数]
复制代码
选项
  1. -v                                #反转查找;
  2. -r                                #当指定要查找的是<目录>而非文件时,必须使用这项参数;
  3. -E                                #识别扩展正则进行过滤;等同于egrep;
  4. -o                                #展示匹配过程;
  5. ------------------------------------------------------------
  6. --color                        #对筛选出的WORD加颜色显示;建议设置永久别名;
  7. -i                                #搜索时不区分大小写;
  8. -n                                #搜索出的结果显示行号;
  9. -w                           #过滤的内容两边必须是空格(类似于边界符)
  10. -c                           #统计单词出现的次数;
  11. -A                           #过滤到内容往下2行;
  12. -B                           #过滤到内容往上2行;
  13. -C                           #过滤到内容上下各2行;
复制代码
示例
  1. #在/etc/passwd文件中过滤出root的行
  2. [root@Dezyan ~]# grep 'root' /etc/passwd
  3. root:x:0:0:root:/root:/bin/bash
  4. operator:x:11:0:operator:/root:/sbin/nologin
  5. #不区分大小写过滤出 /etc/ssh/sshd_config 文件中包含`port 22`的行并输出行号
  6. [root@Dezyan ~]# grep -i -n  'port 22'   /etc/ssh/sshd_config
  7. 17:#Port 22
  8. #排除(取反)/etc/selinux/config文件中的#和注释
  9. [root@Dezyan ~]# grep -v '^#|^$'  /etc/ssh/sshd_config
  10. #统计word.txt文件中shutdown单词的个数
  11. [root@Dezyan ~]# grep -c 'shutdown' word.txt
  12. 2
  13. #显示文件word.txt中config的上下各两行
  14. [root@Dezyan ~]#  grep -C 2 'config' word.txt
  15. test        测试                       
  16. server        服务                       
  17. configure        配置        config        conf        cfg
  18. continue        继续                       
  19. next        下一个
复制代码
sed 功能强大的流式文本编辑器



  • 语法情势
  1. sed [选项] '[模式][动作]' [参数]
复制代码


  • 选项
  1. -n                        #取消内存空间默认输出;不添加时sed命令会默认输出文件所有内容及匹配到的内容;
  2. -r                        #使模式中的正则表达式支持扩展正则;
  3. -i                        #对源文件进行修改;不添加时不会修改;
复制代码


  • 模式
  1. number                                                                #按行查找,查找第n行
  2. number或正则符号,number或正则符号                   #查找n到m行
  3. /字符串或正则表达式/                                          #模糊查询,查询包含此字符串的行
  4. /字符串/,/字符串/                                                 #匹配区间:查询两个字符串之间的内容(也可用正则)
  5. n[动作];m[动作]                                                 #指定第n行和第m行进行操作
复制代码


  • 动作
  1. p                                                #输出打印过滤出的内容
  2. d                                                #删除过滤出的内容
  3. a        字符串                                    #add 在……后追加xxx
  4. i        字符串                                    #insert 在……前插入xxx
  5. c        字符串                                    #replace 将……替换为xxx
  6. w        文件                                   #将过滤到的内容写入到文件中
  7. --------------------------------------------------
  8. s###g                                        #1.其中,g代表全局替换
  9.                                                 #2.s///g、s@@@g等与s###g效果相同       
复制代码
注意:


  • 动作中有p,模式中必有n
  • 在利用匹配区间( /开头字符串/,/末端字符串/ )时,尽量利用文件内容中唯一的、不重复的字符串

    • 若只有一个开头,有两个甚至多个末端时:输出的内容只会是开头到第一个末端字符串之间的内容
    • 若只有开头,末端字符串没有:输出的内容为开头字符串到文件末尾

  • sed的后向引用
  1. sed 's#(正则)(数字)(字符串)#\1\3#g'                 #\n获取第n个()中的内容
复制代码
实例
  1. #获取IP地址
  2. [root@Dezyan ~]# ip add show ens33 | sed -rn '3s#.*et (.*)/24 .*$#\1#gp'
  3. 10.0.0.101
  4. #批量创建用户test01..test03
  5. [root@Dezyan ~]# echo test{01..03} | xargs -n1 | sed -r 's#(.*)#useradd \1#g' | bash
  6. ##批量创建用户test01..test03并设置密码为dingzhiyan1016
  7. echo test{01..03} | xargs -n1 | sed -r 's#(.*)#useradd \1 ; echo dingzhiyan1016 | passwd --stdin \1#g' | bash
  8. [root@Dezyan ~]# echo test11{01..03} | xargs -n1 | sed -r 's#(.*)#useradd \1 ; echo \1:dingzhiyan1016 | chpasswd #g'  | bash
  9. #批量删除用户
  10. [root@Dezyan ~]# echo user{1..20} | xargs -n1 | sed -r 's#(.*)#userdel -r \1#g' | bash
复制代码


  • 示例
  1. 1.a.txt文件
  2. [root@Dezyan ~]# cat -n a.txt
  3.      1        The first snow came.
  4.      2        How beautiful it was, falling so silently all day long,
  5.      3        all night long.
  6.      4        on the mountains, on the meadows,
  7.      5        on the roofs of the living, on the graves of the dead! A
  8.      
  9. 2.查看a.txt文件第三行的内容
  10. [root@Dezyan ~]# sed -n '3p' a.txt
  11. all night long.
  12. 3.查看a.txt文件中第三行到结尾的内容
  13. [root@Dezyan ~]#  sed -n '3,$p' a.txt
  14. all night long.
  15. on the mountains, on the meadows,
  16. on the roofs of the living, on the graves of the dead! A
  17. 4.查看a.txt中以o开头或以T开头的行
  18. [root@Dezyan ~]# sed -rn '/^o|^T/p' a.txt
  19. The first snow came.
  20. on the mountains, on the meadows,
  21. on the roofs of the living, on the graves of the dead! A
  22. 5.查看a.txt文件中包含so与meadows行之间的内容
  23. [root@Dezyan ~]# sed -n '/so/,/meadows/p' a.txt
  24. How beautiful it was, falling so silently all day long,
  25. all night long.
  26. on the mountains, on the meadows,
  27. 6.在a.txt文件1到3行后都添加一行Dezyan
  28. [root@Dezyan ~]# sed '1,3i Dezyan' a.txt
  29. Dezyan
  30. The first snow came.
  31. Dezyan
  32. How beautiful it was, falling so silently all day long,
  33. Dezyan
  34. all night long.
  35. on the mountains, on the meadows,
  36. on the roofs of the living, on the graves of the dead! A
  37. 7.将a.txt文件中所有的(第一个)on替换为under
  38. [root@Dezyan ~]# sed 's#on#under#g' a.txt (只替换第一个只需将g去掉即可)
  39. The first snow came.
  40. How beautiful it was, falling so silently all day lunderg,
  41. all night lunderg.
  42. under the mountains, under the meadows,
  43. under the roofs of the living, under the graves of the dead! A
  44. 8.查找roofs所在行,并将其替换为floor,并且只显示替换行
  45. [root@Dezyan ~]# sed -n '/roofs/s#roofs#floor#gp' a.txt
  46. on the floor of the living, on the graves of the dead! A
  47. 9.删除文件amount.txt中的所有字母
  48. [root@Dezyan testdir]# sed -r 's#[a-Z]##g' amount.txt
复制代码
awk 文本和数据进行处置处罚的编程语言



  • 语法情势
  1. awk [选项] '哪一行{print 哪一列}' [file]
  2. #逻辑:按行取列,先将符合条件的行尽数找出,再对其中的某一列进行选取;
  3. #awk本质上其实是一种编程语言,其中可以进行运算;
复制代码


  • 选项
  1. -F ""                        #指定分隔符;
复制代码


  • 取行
  1. #当语法形式中的`{print 哪一列}`为空即为取行
  2. 1.指定某行或某几行
  3. 语法形式:
  4.                 awk 'NR[运算符]n' file
  5. 使用awk内置变量:
  6.                 NR  --> 存储每行的行号
  7. 运算符:
  8.                 == 等于
  9.                 >  大于
  10.                 >= 大于等于
  11.                 <  小于
  12.                 <= 小于等于
  13.                 != 不等于
  14.                 && 且
  15.                 || 或
  16. #可使用内置函数取出文件内容的最后一行
  17.                 awk 'END{print}' file
  18. 2.模糊过滤取行
  19. 语法形式:
  20.                 awk '模式' file
  21. 模式'可以使用正则符号':
  22.                 //                #模糊查找文件中的字符串
  23.                 //,//        #模糊查找两字符串之间的内容
复制代码


  • 字符比对查取行
  1. 语法形式:
  2.                 awk [选项] '[取列内置变量] [模式匹配符] "[表达式]"' file
  3. 模式匹配符:
  4.                 ==                #某列等于……
  5.                 !=                #某列不等于……
  6.                 ~                #使用正则匹配字符串
  7.                 !~                #使用正则匹配字符串并取反
  8. 表达式:
  9.                 任意字符
  10.                 正则表达式
复制代码


  • 数字比对查取行
  1. 语法形式:
  2.                 awk [选项] '[取列内置变量] [模式匹配符][运算符]n' file
复制代码


  • 取列
  1. #当语法形式中的`哪一行`为空即为取列
  2. 语法形式:
  3.                 awk '{print [内置变量]}' file
  4. awk内置变量:
  5.                 $0          # 表示整行
  6.                 $n          # 表示文件的第n列
  7.                 ,           # 逗号表示空格
  8.                 NF          # 表示每一行最后一列的列号
  9.                 $NF                # 表示最后一列;`$(NF-1)`表示倒数倒数第二列 --> 也体现了awk支持运算的特性
复制代码


  • 指定分隔符取列
  1. 语法形式:
  2.                 awk -F "[表达式]" '{print [内置变量]}' file
  3. 表达式:
  4.                 任意字符
  5.                 正则表达式
复制代码


  • 指定分隔符按行取列
  1. awk -F "[表达式]" '取行方式+取列方式' file
复制代码


  • BEGIN的用法
  1. #BEGIN 是一个特殊的模式,它在处理任何输入行之前执行一次。
  2. awk -F "[表达式]" 'BEGIN{print 任意内容}' file
复制代码


  • 示例
  1. #过滤文件的选择:/etc/passwd文件的前10行,存储到了~/passwd.txt中
  2. #即:head /etc/passwd >> ~/passwd.txt
  3. #在未明确说明分隔符时,默认指定分隔符为":"
  4. 1.指定取行
  5. #取出文件最后一行
  6. [root@Dezyan ~]# awk 'END{print}' passwd.txt
  7. #取出第7行和第9行以及两行之间的内容
  8. [root@Dezyan ~]# awk 'NR>=7&&NR<=9' passwd.txt
  9. 2.模糊取行
  10. #取出文件中以root开头和以adm开头以及两行之间的内容
  11. [root@Dezyan ~]# awk '/^root/,/^adm/' passwd.txt
  12. 3.字符比对取行
  13. #取出文件中用户名为root的行
  14. [root@Dezyan ~]# awk -F: '$1=="root"' passwd.txt
  15. #取出文件中以nologin结尾的行
  16. [root@Dezyan ~]# awk -F: '$NF~"nologin$"' passwd.txt
  17. 4.数字比对取行
  18. #取出用户uid大于6的行
  19. [root@Dezyan ~]# awk -F: '$3>6' passwd.txt
  20. 5.取列
  21. #输出文件每一行最后一列的序号(以:或\或:\为分隔符)
  22. [root@Dezyan ~]# awk -F "[:/]+" '{print NF}' passwd.txt
  23. #输出文件的第一列和最后一列(以:或\或:\为分隔符)
  24. [root@Dezyan ~]# awk -F "[:/]+" '{print $1,$NF}' passwd.txt
  25. 6.BEGIN用法示例
  26. #在输出文件第一列内容前,先输出“用户名”
  27. [root@Dezyan ~]# awk -F: 'BEGIN{print "用户名"}{print $1}' passwd.txt
  28. #让输出的第一列内容前,都有“用户名:”几个字
  29. [root@Dezyan ~]# awk -F: '{print "用户名:"  $1}' passwd.txt
  30. 7.综合运用
  31. #输出文件最后一行的最后一列
  32. [root@Dezyan ~]# awk -F: 'END{print $NF}' passwd.txt
  33. #输出大于第5行到结尾的内容,并取出第3列
  34. [root@Dezyan ~]# awk -F: 'NR>5{print $3}' passwd.txt
  35. #输出用户uid大于6的行并输出用户名
  36. [root@Dezyan ~]# awk -F: '$3>6{print $1}' passwd.txt
  37. #将系统重不能登录的用户输出到nologin.txt文件中,并在文件的开头显示“不能登录的用户有:”
  38.         ##注:使用awk命令;不能使用管道符
  39. [root@Dezyan ~/testdir]# awk -F: 'BEGIN{print "不能登录的用户有:"} $NF~"nologin$"{print $1}' /etc/passwd >> nologin.txt
  40. 不能登录的用户有:
  41. bin
  42. daemon
  43. ……………………
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表