参考题目出处参考题目
前言
看见题目不错,拿来自己复习做一遍,收获不少
题目与解析
1、显示/etc/passwd文件中以bash结尾的行;
grep 'bash$' /etc/passwd2、找出/etc/passwd文件中的三位或四位数;
grep '[0-9]{3,4}' -E /etc/passwd忘记-E
基础正则不支持{},拓展正则与Perl支持{},只能使用{N,M}形式,不可以使用{N-M},{N..M}
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
1-N +
grep '^\s+\S' -P /etc/grub2.cfg4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0个或多个空白字符结尾的行;
netstat -tan|grep -P 'LISTEN\s*' 5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;
fdisk -l|grep '/dev/(sd|hd|[a-zA-Z])' -E基础正则不直接支持捕获组()和或|,但是通过转义可以解决,但是还是麻烦了
fdisk -l|grep '/dev/\(sd\|hd\|[a-zA-Z]\)'6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
ldd /usr/bin/cat|grep '(/\S*)+' -P 7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
grep '^[Ss]' /proc/meminfo
grep -E '^(S|s)' /proc/meminfo
grep -i "^s" /proc/meminfo'^s|S'匹配的是以s开头或包含S的行,所以必须使用()括起来,注意加-E
8、显示当前系统上root、centos或spark用户的相关信息;
egrep "(root|centos|spark)" /etc/passwd9、echo输出一个绝对路径,使用egrep取出其基名;
echo '/var/log/nginx/error.log'|egrep '.*/' -o #取路径默认贪婪匹配
注意末尾添加-o,否则会按行输出等于没过滤
echo '/var/log/nginx/error.log'|awk -F '/' '{print $NF}' #取文件名
10、找出ifconfig命令结果中的1-255之间的整数;
#有问题的版本1
ifconfig|grep '\d{1,3}' -P
如果仅有'\d{1,3}'时会匹配到如1238762这样的长数字的,那么是否可以通过检查数字两旁为非数字呢#有问题版本2
ifconfig|grep '\D\d{1,3}\D' -P -o|grep '\d{1,3}' -P -o
#但是这样会匹配到两旁的非数字导致需要二次过滤
#补:这样的数组是1-999而不是1-255#对于2开头的需要关注,因为如果为2[1-5][1-9]可能出现259,所以对250前后针对个位数分开
#开头一位不可能为0,但是后面可以为0,也需要区分
ifconfig|grep '[1-9]|[1-9][0-9]|1[1-9][1-9]|2[0-4][0-9]|25[0-4]' -P -w -o这题做的不好,因为一直都没有用过-w导致即使我分析出了1-255的正则也无法阻止长数字的分裂.-w表示单词,就是两边有空白字符的字符串(这里包括'数字')
11、找出系统中其用户名与shell名相同的用户。
/etc/passwd格式如下
root:x:0:0:root:/root:/bin/bash
$1与$7的部分相同,需要使用if判断,要对shell进行分割,取最后的文件名(这里是bash)
#错误版本1
awk -F ':' 'split($7, arr, "/");{if ( $1 == arr[length(arr)]){print $1}}'以上输出全部+需要的部分,部分成功,有全部输出的原因是
akw是按/pattern/{action}执行的,以上被awk认为有两个这种模式,一个是split..,一个是{if...},split的模式默认全部输出(没有{action}就默认全部输出),这导致每行都会全部输出
#错误验证
awk -F ':' 'split($7, arr, "/");split($7, arr, "/");{if ( $1 == arr[length(arr)]) {print $1}}' /etc/passwd会发现每行重复输出了2遍,不出所料
限制到print,在awk种{}就是需要执行的
注意.if判断只能在{}内进行判断,并且awk的if不是shell环境的if,使用(),使用==进行等值判断
awk -F ':' '{split($7, arr, "/");if ( $1 == arr[length(arr)]) {print $1}}' /etc/passwd12、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;
grep '^[hH]' /etc/rc.d/rc.sysinit13、显示/etc/passwd中以sh结尾的行;
grep 'sh$' /etc/passwd14、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
1-N + 0-N *
grep -P '^#\s+\S*' /etc/fstab15、查找/etc/rc.d/rc.local中包含“以to开始并以al结尾”的字串行;
grep '^to.*al$' /etc/rc.d/rc.local16、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行;
单词\w或<>
grep -E '\<b\S*t\>' /etc/rc.d/rc.local匹配单词的\<与\>必须转移,无论是基础正则还是拓展正则,perl不支持\<与\>
17、显示/var/log/secure文件中包含“Failed”或“FAILED”的行;
grep -i 'failed' /var/log/secure
grep '[Ff][aA][iI][lL][eE][dD]' /var/log/secure18、在/etc/passwd中取出默认shell为bash的行;
grep 'bash$' /etc/passwd19、以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息;
格式如下
drwxr-xr-x. 4 root root 4096 Jun 28 2024 systemd
ll /etc|grep 'ns.*\.conf'原本想用awk做的,但是我发现这个没有歧义,其他几列根本不可能是ns.*.conf的格式
20、高亮显示passwd文件中冒号,及其两侧的字符;
grep -E '.?:*:.?' /etc/passwd