反思以及建议:
-
由于语法的丰富,尽可能的多思考某题的解题方法;
-
多思考这样的答案还可以应用在什么样的场景里;
-
写完一道题停顿思考一下
-
熟读文档‘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