正则表达式习题精选
基础部分
-
找出/proc/meminfo文件中,所有以大小或小写s开头的行,至少三种方式
grep -E '^(s|S)' /proc/meminfo //扩展模式 grep -i '^s' /proc/meminfo //忽略大小写 sed -r -n '/^(s|S)/p' /proc/meninfo //sed模式
-
显示当前系统上root,centos或者user1用户的相关信息
cat /etc/passwd |grep -E '^(root|centos|user1)\>'//左边开头且右边是同类型字符
-
找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep -P '\b\w*\b\(\)' /etc/rc.d/init.d/functions grep -E '\b([a-zA-Z]|_|[0-9])*\b\(\)' /etc/rc.d/init.d/functions grep -Eo "[_[:alnum:]]+\(\)" //[:alnum:]字母和数字
-
使用echo命令输出一绝对路径,使用grep取出其基名(basename)
echo /etc/rc.d/init.d/functions |grep -Po '\b/\w*$'|grep -Po '\w*' echo /etc/sysconifg/network-srcipts/ifcfg-ens33 |grep -Eo "\<[^/]+/?$" //没有以/开头且没有以/结尾的字符串
-
取出其路径名,类似dirname命令的结果
-
找出ifconfig命令结果中1-255之间的数值
ifconfig |grep -P ‘\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b’
2. 添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);然后找出/etc/passwd文件用 户名同shell名的行 ```c cat /etc/passwd |grep -E '^(\w*):.*\1$' cat /etc/passwd |grep -E "^(\<.*\>):.*\1$" //(???) \1 grep -E "^[^:]+\>" //逆向思考 grep -Eo "^([^:]+\>).*\1$"
- 获取ifconfig中命令的ip地址,使用三种方式实现
方法一: ifconfig|grep -oE "inet [0-9.]+ "|awk '{print $2}' //辅助awk 方法二: ifconfig|grep -oP '(?<=inet )(.*)(?=netmask)' //零宽断言 方法三: //三类ip地址第一个字段范围:A:1-127;B:128-191;C:192-223,合并起来就是1-223,第二第三字段是0-255,最后一个字段是1-254 ifconfig |grep -oP '\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])\b\.(\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\.){2}\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\b' 方法四: ifconfig | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' //简单粗暴有瑕疵 方法五: ifconfig |grep -o '\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b' //简单无脑粗暴
-
进阶部分
-
只在目录中所有的.php和.html文件中递归搜索字符"main{}"
grep -r "main{}" . --include *.{php,html}
-
在搜索结果中排除所有README文件
grep -r "main{}" . --exclude "README"
-
在搜索结果中排除filelist文件列表里的文件
grep -r "main{}" . --exclude-from filelist
-
在多级目录中对文本进行递归搜索
grep -r -n -E '^(#!/bin/bash)' . //. 指的是当前目录路径
-
搜索多个文件并查找匹配文本在哪些文件中
grep -n "root" /etc/fstab /etc/shadow /etc/passwd
-
搜索fstab开头不是英文字母的行,并显示行号
第一种: cat /etc/fstab|grep -nv '^[a-zA-Z]' //反向选择 第二种: cat /etc/fstab |grep -n "^[^a-zA-Z]" //反向选择
-
搜索fstab中c后面跟1,2个d,后面再跟一个3的字符串的行
cat /etc/fstab|grep -E 'cd{1,2}3'
-
过滤空行和开始为#开始的行
#cat /etc/fstab|grep -vE '^$|^#'
-
找出/etc/rc.d/rc.sysinit或/etc/grub.conf文件中,以至少一个空白字符开头,且后面存在非空白字符的行
cat /etc/grub2.cfg|grep -P '^(\s{1,})\S' cat /etc/grub2.cfg|grep -P '^\s+\S'
-
列出系统所有系统用户
cat /etc/passwd |awk -F: '$3>=1 && $3 <=1000{print $1}'
-
过滤functions文件中,以单词或者单词前面跟了一个"_"开头的行,并显示前后2行
grep -P -C 2 '^_?\b\w+\b' /etc/rc.d/init.d/functions grep -E2 "^[_[:alnum:]]+\\(\\)" /etc/rc.d/init.d/functions
高级部分
-
显示/etc/rc.d/rc.sysinit中以#开头,且后面跟了一个或多个空白字符,而后又跟了任意非空白字符的行
grep -P -n '^#\s+\S*' /etc/rc.d/rc.sysinit
-
查找/proc/cpuinfo文件中关键字flags,并显示前后一行
grep -C 1 'flags' /proc/cpuinfo
-
查找包含至少一个root关键字的文件
//内容包含: grep -P -r '(root)+' . find . -type f -print0| xargs -0 grep -c banana |grep -v ":0$"
-
查找文本中的所有qq邮箱(进阶:查找所有邮箱)
grep -P '^[1-9]{1}[0-9]{5,9}@qq.com' ./mail.txt
-
查找/etc目录下,所有包含root关键字的文件,并显示文件路径及文件名
grep -l -r 'root' /etc | xargs ls -l
-
监控日志文档中产生Error的行,并只打印包含Error的行
tailf -f /var/log/nginx/error.log |grep --line-buffer 'Error' //行缓冲:每更新一行就监控控一行
课堂练习
1.定义一个ipadd的变量,此变量的内容为eth0的网卡ip,并要求此变量在所有的shell中都能生效
ipadd=`ifconfig ens33 | grep 'inet.*netmask'|awk '{print $2}'
export ipadd
2.将系统环境变量PATH的值改为/bin,然后执行passwd 修改当前用户的密码能成功么
不能,passwd命令的文件路径为:/usr/bin/passwd,PATH路径设置为/bin后,直接执行passwd是找不到符合的路径
3.将当前的系统的语言环境变成中文(如已是中文则切换成英文),并永久生效
export LANG="zh_CN.UTF-8"
4.找出系统中小于1k的文件并复制到/var/tmp/find_dir中,并放入后台执行
mkdir -p /var/tmp/find_dir;find -size -1k -exec cp -a {} /var/tmp/find_fir \; > /dev/null &
5.对系统的组账户文件统计,并对他们的gid做排序,输出到文件~/gid.txt,并对输出做行数统计
sort -t: -k3 -n /etc/group |tee ~/gid.txt |wc -l
6.使用sed直接对文件~/install.log做修改,将x86_64全部修改为i386,并生成备份文件
|sed -i.bak's/x86_64/i386/g' ~/install.log