T O P

[资源分享]     shell脚本应用(四)

  • By - 楼主

  • 2020-12-02 11:00:49
  • --正则--
    基础正则
    ^word     ##搜索以word开头的 vi/vim中 ^ 一行的开头
    word$     ##搜索以word结尾的 vi/vim中 $ 一行的结尾
    ^$        ##表示空行
    .         ##代表且只能代表任意一个字符
    \         ##例:\. 只代表点本身,转义符号,让有特殊身份意义的字符,脱掉马甲,还原
    \n        ##换行符
    \r        ##匹配回车
    \w         ##匹配任意一个字符和数字
    *         ##重复0次或多次前面的一个字符
    .*        ##匹配所有字符。例:^.* 以任意多个字符开头,.*$以任意多个字符结尾
    [abc]     ##匹配字符集内的任意一个字符
    [^abc]    ##匹配不包含 ^ 后的任意字符的内容。中括号里的 ^ 为取反
    [1-9]     ##表示匹配括号内的范围内的任意字符
    a\{n,m\}  ##重复n到m次前一个重复的字符。若用egrep、sed -r可以去掉斜线
    \{n,\}    ##重复至少n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线
    \{n\}     ##重复n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线
    \{,m}\    ##重复少于m次
    注:egrep,grep –E或sed –r 过滤一般特殊字符可以不转义
    扩展正则(egrep或grep -E)
    +          ##重复一次或一次以上前面的一个字符
    ?          ##重复0次或一次前面的一个字符
    |          ##或者的意思,用或的方式查找多个符合的字符串
    ()         ##找出括号内的字符串
    grep awk sed 语法
    (一)grep
    grep [选项] [条件表达式] 目标文件
    例如:
    cat /proc/meminfo |grep -e Mem -e Cache -e Swap     ##查看系统内存、缓存、交换分区-e的作用是匹配多个表达式
     
    grep -R -o -n -E  '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/     ##查找/etc目录下的所有文件中的邮件地址;-R递归,-n表示匹配的行号,-o只输出匹配内容,-E支持扩展正则表达式,
     
    grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"     ##查找/etc/目录下文件中包含“HOSTNAME”的次数,-c统计匹配次数,-v取反
     
    grep -R -l 'HOSTNAME' /etc/           ##查找包含“HOSTNAME”的文件名,-l显示匹配的文件名,-L显示不匹配的文件名
     
    dmesg | grep -n --color=auto 'eth'       ##查找内核日志中eth的行,显示颜色及行号
     
    dmesg | grep -n -A3 -B2 --color=auto 'eth'     ##用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起找出出来显示
     
    cat /etc/passwd |grep -c bash$         ##统计系统中能登录的用户的个数
     
    touch /tmp/{123,123123,456,1234567}.txt   ##创建测试文件,以下三条命令是一样的效果,匹配文件名123,可以包含1个到多个
    ls |grep -E '(123)+'
    ls |grep '\(123\)\+'
    ls |egrep '(123)+'
     
    ps -ef |grep -c httpd             ##统计httpd进程数量
     
    grep -C 4 'games' --color /etc/passwd       ##显示games匹配的“-C”前后4行
     
    grep ^adm /etc/group             ##查看adm组的信息
     
    ip a |grep -E '^[0-9]' |awk -F : '{print $2}'     ##获取网卡名称
     
    ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*'   ##截取ip地址,[^ ]*表示以非空字符作为结束符,[0-9.]*表示数字和点的组合
     
    ip a |grep inet |grep eth0 |grep -o "inet[^/]*" |grep -o "[0-9.]*"  ##截取ip地址
     
    ifconfig eth0 |grep -i hwaddr |awk '{print $5}'   ##截取MAC地址
     
    ip a |grep -A 3 "eth0" |grep link/ether |grep -o "ether[^r]*" |grep -o -E "[0-9a-f:]+"|grep -E "[0-9a-f:]{2}$"      ##截取MAC地址
     
    grep "^m" oldboy.log       ##过滤输出以m开头的行
    grep "m$" oldboy.log
    grep -vn "^$" oldboy.log       ##过滤空行
    grep -o "0*" oldboy.log
    grep -o "oldb.y" oldboy.log
    grep "\.$" oldboy.log       ##以.结尾的行
    grep "0\{3\}" oldboy.log       ##重复三次
     
    (二)sed
    语法:sed 选项  ‘内容’  文件名
    选项:
    -n 抑制自动打印pattern space,sed默认输出全部,-n用于取消默认输出
    -i 编辑文件
    -r 支持扩展正则表达式
    1.改:
    语法:sed '/正则匹配条件/s/old/new/g' 文件
    sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是显示,不修改
    sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改,不显示
    sed -i 's/dhcp/static/g' ip ##将所有的dhcp替换为static
    sed -i '/^IP1/s/static/dhcp/g' ip ##将IP1开头的行替换
    sed -i '2s/static/dhcp/g' ip ##指定特定行号2行替换
    cat -n /etc/selinux/config ##查看并显示行号
    sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##开启selinux
    2.删:
    语法:sed '/表达式/d' 文件
    vim ip ##添加空行
    sed '/^$/d' ip ##删除空行并显示在屏幕上
    sed -i '/IP1/d' ip ##删除包含IP1的行
    sed -i '/^IP2/d' ip ##删除以IP2开头的行
    sed -i '2d' ip ##删除第二行
    3.增:
    语法:sed ' /表达式/a "需要添加的文字"' 文件
    sed 'a IP3=static' ip ##每一行后都加上IP3=static
    sed '3a IP3=static' ip ##只在第3行后加上IP3=static,并显示不修改
    sed '3i IP3=static' ip ##只在第3行前加上IP3=static,显示不修改
    sed -i '3a IP3=static' ip ##修改,不显示
    sed -i '/^IP3/a "test add"' ip ##在以IP3开头的行后添加
     
    (三) awk
    awk [选项] '模式{动作 ranges}' 文件1 文件2 ...
    选项: -F   指定输入分隔符,可以是字符串或正则表达式
    常用动作: print、printf
    匹配范围(ranges):指定的匹配范围,格式为part1,part2(例如$1,$2)
    awk的变量:
    awk变量:
    FS:列分隔符,默认位空白
    RS:行分隔符,默认位换行符
    OFS:输出列分隔符
    ORS :输出行分隔符
    awk内置变量:
    NR:处理中行数
    FNR:单个文件的行数
    NF:列的个数

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册