• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • 三剑客练习

    2025年03月20日 9 阅读 0 评论 3589 字

    参考题目出处参考题目

    前言

    看见题目不错,拿来自己复习做一遍,收获不少

    题目与解析

    1、显示/etc/passwd文件中以bash结尾的行;

    grep 'bash$' /etc/passwd

    2、找出/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.cfg

    4、找出"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/passwd

    9、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/passwd

    12、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;

    grep '^[hH]' /etc/rc.d/rc.sysinit

    13、显示/etc/passwd中以sh结尾的行;

    grep 'sh$'  /etc/passwd

    14、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
    1-N + 0-N *

    grep -P  '^#\s+\S*' /etc/fstab

    15、查找/etc/rc.d/rc.local中包含“以to开始并以al结尾”的字串行;

    grep '^to.*al$'  /etc/rc.d/rc.local

    16、查找/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/secure

    18、在/etc/passwd中取出默认shell为bash的行;

    grep   'bash$' /etc/passwd

    19、以长格式列出/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
    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.026 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。