linux grep正则表达式习题解析

反思以及建议:

  • 由于语法的丰富,尽可能的多思考某题的解题方法;

  • 思考这样的答案还可以应用在什么样的场景里;

  • 写完一道题停顿思考一下

  • 熟读文档‘man grep

基础部分

1.用多种方式输出/proc/meminfo文件中所有以大写或小写s开头的行

提示:忽略大小写;扩展方式不同写法

grep -i '^s' /proc/meninfo

echo -e "sb\nSb\nsB\nSB" | grep -i '^s'

grep -E "^(s|S)" /etc/fstab

grep "^\(s\|S\)" /etc/fstab

2.显示当前系统上root,centos,或者user用户的相关信息

grep -E '^root|^centos|^root' /etc/passwd

3.输出文件/etc/rc.d/init.d/functions所有函数名(某单词后面跟小括号的行)

提示:单词开头,括号结尾

grep -P "\b\w+\(\)" /etc/rc.d/init.d/functions

4.输出路径字符串 /ssa/sssb/ssc 中最后的文件名ssc

提示:除斜杠/外的字符且字符至少出现一次(文件名非空),且以除斜杠/外的字符结尾

echo /sss/ssss/sss | grep -o -P "[^/]+$"

变种题:输出除最后一个文件名外的路径

提示:任意字符且以斜杠结尾

echo /sss/ssss/sss | grep -o -P ".*/"

5.查找ifconfig命令中介于0-255的数字;

提示:分类讨论/扩展正则

ifconfig | grep -E "\b([1-9] | [1-9][0-9] | 1[0-9[0-9] | 2[0-4][0-9] | 25[0-5] )\b"

6.找出文件用户名同shell名相同的行

提示:用户名在第一个单词,shell名是最后一个单词,中间当做任意字符看待

grep -P '^\b(\w+)\b.*\1$' /etc/fstab

7.输出/???/???里的ip地址

提示:主机号介于1-254,可以根据上面的0-255变种,但比较复杂,应用在输出私有IP地址比较麻烦

grep -Po '(?<=inet)(.*)(?=net)'  /???/???

进阶部分

8.在所有.php .html文件中递归搜索字符main{}

grep"main()" . -r --include *.{php,html}

9.对多个文件目录下做递归搜索以/sbin/nologin结尾的行

grep -r -n '/sbin/nologin$' /etc

10.搜索fstab开头不是英文字母的行,并显示行号

提示:以英文字母开头且取反

grep -E -v -n'^[a-zA-Z]' /etc/fstab

或者‘^[^a-zA-Z]'

11.过滤空行还有以#开头的行

grep -E -v '^$|^#' /etc/fstab

12.找出文件中以至少存在一个空白字符且后面存在非空白字符的行

grep -P '^\s\S+' /etc/grub2.cfg

13.列出所有系统用户

提示:UID:1-999

grep -P '\b[1-9]\d{0,2}\b' /etc/passwd

cat /etc/passwd | awk -F: '$3>1 && $3<1000{print $0}'

14.过滤文件中,以单词或者单词前面跟了一个_开头的行,并显示前后两行

提示:_?;必有单词

grep -C2 -P '_?\b\w+\b' /etc/rc.d/init.d/functions

猜你喜欢

转载自blog.csdn.net/weixin_31789689/article/details/106796866