加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell编程 && || grep

发布时间:2020-12-15 23:26:37 所属栏目:安全 来源:网络整理
导读:shell脚本就是文本文件, 就是命令的堆积 分为三点 1 顺序执行 2 循环执行 3 选择执行 变量: 变量是什么=命名的内存空间: 逻辑与 一个执行都执行 逻辑或 || 一个执行 一个不执行 Linux上文本处理三剑客 grep 文本过滤工具 sed 文本编辑工具 awk 文本报告生
shell脚本就是文本文件, 就是命令的堆积
分为三点 1 顺序执行 2 循环执行 3 选择执行
变量:
变量是什么=命名的内存空间:
逻辑与 && 一个执行都执行


逻辑或 || 一个执行 一个不执行

Linux上文本处理三剑客
grep 文本过滤工具
sed 文本编辑工具
awk 文本报告生成器
grep Global search 全文搜索正则表达式打印出来
作用: 文本搜索工具 针对文本逐行进行匹配检查 默认显示能匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
正则表达式: 由一类特殊字符及文本字符所编写的模式 其中有些字符表示控制和统配的功能
分两类
基本正则表达式 BRE: grep
扩展正则表达式 ERE: egrep grep -E
正则表达式引擎:
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

-v 取反 匹配的都是行
-l 匹配检查是忽略字符大小写
-o 仅显示匹配到的子串 不显示整行


-q 静默模式 不输出任何信息


-A -B -C 后面跟的都是数字n 显示匹配到的行及前后的行 面试的时候好像是有
-E 使用可扩展的正则表达式 ERE

基本正则表达式元字符
字符匹配:
. :匹配任意单个字符
[ ]:匹配范围内任意单个字符
其中这个感觉很有用 [:digit:] 表示所有数字 和[ 0-9 ]一样
[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号 所有的标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符
以上和tr的用法是一样的


匹配任意三个在一起的字母
下面匹配f前面任意三个字符的


如果使用‘...f‘会匹配包含符号的任意三个字符串


匹配次数: 上面的用法很拙劣,那怎样匹配次数呢?

  • :表示匹配前面的字符0-n次,本身不代表任何数字字符
    abxy
    xay 这个也行 相当于x出现了0次


    默认工作于贪婪模式,能匹配多少就匹配多少。。。。
    .*:任意长度的任意字符
    ?:匹配其前面的字符0次或1次,也就是前面可有可无
    +:匹配前面字符至少一次,可以无限多...
    以上都没有明确精确制定....
    {m}
    {m,n}:匹配前面字符最少m次 最多n次
    {m,} 至少出现m次 最多不限
    以上中的{} 在shell中有特殊含义,所以前面要使用符号
    以上虽然能提取字符或行,但是不能锁定字符串的位置,也就是说,如果我要提取开头是空格的行 前面是做不到的 这就有了 ^$两个符号 表示行首和行尾
    &; 或b:词首锁定,用于单词模式的左侧
    &;或 b:词尾锁定:用于单词模式的右侧
    &;PATTERN> :匹配整个单词
    ()小括号 匹配整体 如:


    练习:
    1。显示/proc/meninfo文件中以大小s开头的行(使用两种方式)

    [[email?protected] ~]# grep -i ^s /proc/meminfo
    第二种方法暂时找不到
    2.显示/etc/passwd、下不以/bin/bash结尾的行
    grep -v /bin/bash$ /etc/passwd 比较简单 直接-v取反就行

    1. 显示/etc/passwd中ID好最大的用户的用户名
      sort -t: -k 3 -n /etc/passwd | tail -1 | cut -d: -f1
      这个弄半天 有点复杂 也不知道对不对哦
      主要是 使用sort指定-t为: 然后按照第三列 以数值形式排序 使用tail提取最后一行(因为是正常排序的,也可以机上-r逆向排序后使用head -1),最后使用cut 指定:为分隔符。打印第一列 ok
      4 。如果root用户存在,显示其默认的shell
      grep ^root /etc/passwd > /dev/null && grep ^root /etc/passwd | cut -d: -f7 || echo "not foud root"
      哈哈 这个写的也是比较复杂的,但是所有命令都用上了,应该符合老师的要求
      当然也可以这样[[email?protected] ~]# grep ^‘brootb‘ /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      5 。找出/etc/passwd中的2位数或者是3位数
      grep -o ‘b[[:alnum:]]{2,3}b‘ /etc/passwd 差点就写不出来了。。。。
      6 显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的,且后面存在飞空字符的行 这个没找到这个文件 find也找不到
      7 找出 “netstat -tan”命令结果中‘LISTEN’后跟0,1或者多个空白字符的行
      netstat -tan | grep LISTEN | grep [[:space:]]
      总结 还是用space好使啊 必须要背下来
      8 添加用户 bash、testbash、basher以及nologin(其shell为/sbin/nologin),最后找出/etc/passwd中用户名与shell相同的行

      这个做的也有点费劲,我这还是学过的人,看来不练习真的不行哎....grep "(^[[:alnum:]]+b).
      1$" /etc/passwd意思是 用户名没没有特殊字符 所以使用 launm 数字或字母 +至少一位数 .* 意思是中间有任意字符 (^[[:alnum:]]+b) 把他们看作是一个整体 1$ 结尾也是(^[[:alnum:]]+b) 前后一样

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读