第33周-鸟哥的Linux私房菜基础篇第三版- 第十二章、正规表示法与文件格式化处理

来源:互联网 发布:sql的with语句 编辑:程序博客网 时间:2024/06/05 18:31
 1、正规表示法:RE 是一种字符串处理的表示方式;主流过滤与分析都用该法;
   2、系统的错误讯息登录档案记录了系统所有信息,包括被【入侵】的纪录数据;
   3、两个邮件服务器软件sendmail与postfix,支持正规表示法; 
   4、基础正规表示法和延伸正规表示法;

   5、先定义好环境语系,因为它与正规表示法有可能产生冲突;本章练习以LANG=C为主。


   6、grep进阶选项:
           grep [-A][-B][--color=auto] '搜寻字符串' filename  
              A加数字,列出当前行与后续n行/B同上,但列出当前与n行前/攫取的数据列出颜色
           例:dmesg | grep 'eth'     dmesg 列出核心产生的信息!!!eth网络卡信息
               dmesg | grep -n --color=auto 'eth'  增加显示行数
               dmesg | grep -A3 -B2 -n --color=auto 'eth'  追加前2后3一起列出
           grep分析:最重要功能是进行字符串数据对比,整行攫取;
           alias grep='grep --color=auto'  别名的设定
           source ~/.bashrc     在个人配置文件内将自定义变量变成环境变量
          (这样以后输入grep可自动加上颜色显示)
       练习先决条件:【export LANG=C】;

                     grep已设定成【grep --color=auto】;

     例1:搜寻特定字符串:
             grep -n 'the' Shawn.txt
          上题反向:
             grep -vn 'the' Shawn.txt
          不论大小写:
             grep -in 'the' Shawn.txt
     例2:利用中括号[]来搜寻集合字符:
             grep -n 't[ae]st' Shawn.txt    共通的t?st存在即可
             grep -n '[^g]oo' Shawn.txt     注意^在中括号里面
             grep -n '[^a-z]oo' Shawn.txt
             grep -n '[^[:lower:]]oo' Shawn.txt
             grep -n '[[:digit:]]' Shawn.txt
     例3、行首与行尾字符 ^ $:
             grep -n '^the' Shawn.txt    只有行首为the的才攫取
             grep -n '^[a-z]' Shawn.txt  攫取开头为小写字母的
             grep -n '^[[:lower:]]'  Shawn.txt  与上同
             grep -n '\.$' Shawn.txt  行尾结束为小数点,需跳脱字符。注意windows的断行符为^M,所以无法被攫取
             grep -n '^$' Shawn.txt  空白行
             grep -v '^$' /etc/syslog.conf | grep -v '^#'  不要空白行和不要开头#的那行
     例4、任意一个字符.与重复字符*:
             grep -n 'g..d' Shawn.txt
             grep -n 'ooo*' Shawn.txt 至少两个o,第三个可有可无
             grep -n 'goo*d' Shawn.txt 
             grep -n 'g*g' Shawn.txt  找出g开头、g结尾的行
     例5、限定连续RE字符范围{}:
             grep -n 'o\{2\}' Shawn.txt 找两个o的字符
             grep -n 'go\{2,5\}g' Shawn.txt  g后面接2到5个o,再接一个g
             grep -n 'go\{2,\}g' Shawn.txt 两个以上的o
          ls -l /etc | grep '^|'   找出/etc/底下文件类型为链接文件属性的文件名
7、sed工具:
      sed [-nefr] [动作]  n安静模式只列处理行/e动作编辑/f动作写入档案/f文件内/r支持延伸正规法/i修改档案
      动作说明:[n1][n2] function  其中n1,n2表示动作行数 
      function包含   a新增/c取代,后接字符串/d删除/i插入/p打印/s取代,直接取代工作。
        例:nl /etc/passwd | sed '2,5d'
            nl /etc/passwd | sed '2a drink tea'   新增字符串在2行后面
            nl /etc/passwd | sed '2i drink tea'  在第2行前面
            nl /etc/passwd | sed '2a drink tea ...... \ drink beer' 增加2行,需用\分开
            nl /etc/passwd | sed '2,5c NO 2-5 number' 字符串将2-5行取代
            nl /etc/passwd | sed -n '5,7p' 抓出5-7行的数据查阅,用n是防止重复输出
       部分数据搜寻并取代:
            sed's/要被取代的字符串/新字符串/g'
            ifconfig | grep 'inet '| sed 's/^.*inet://g' 删除IP前面部分不成功?
         例:grep攫取MAN
               cat /etc/man.config | grep 'MAN'
             删除批注后数据:
               cat /etc/man.config | grep 'MAN'| sed 's#.*$//g'   
             删掉空白行
               cat /etc/man.config | grep 'MAN'| sed 's#.*$//g' | sed '/^$/d'  
       sed直接修改档案内容:危险动作!!! 
         例:sed -i 's/\.$/\!/g' Shawn.txt   取代!是什么意思?
           档案最后一行加入字符串: 
             sed -i '$a # This is Shawn's test' Shawn.txt

8、延伸正规表示法:
      基础法:
         grep -v '^$' Shawn.txt | grep -v '^#' 去除空白行与行首为#
      延伸法:
         egrep -v '^$|^#' Shawn.txt    功能同上(透过群组功能|一次性搜寻,开头可用grep -E或egrep)
         egrep -n 'go+d' Shawn.txt     1个或以上o
         egrep -n 'go?’ Shawn.txt     0或1个,若与上面组合相当于'go*d'
         egrep -n 'g(la|oo)d' Shawn.txt  找群组字符串
         echo 'AxyxyxyxyZ' | grep -n 'A(xy)+Z' Shawn.txt
         grep -n '[!>]' Shawn.txt    查出档案含有!与>的行
         注意,【!】非特殊字符


9、文件的格式化与相关处理:
      格式化打印:printf '打印格式' 实际内容
      特殊样式:a/b/f/n/r/t/v/xNN  
                a警告出声/b退格/f清屏/n输出新一行/r[Enter]/t水平[tab]/v垂直[tab]/xNN 转换数字为字符
      C语言的变数格式:%ns/%ni/%N.nf   s是string/i是整数/f是floating
      例:vim printf.txt
          printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
          printf '%10s\t %5i\t %5i\t %5i\t %8.2f \n' $(cat printf.txt | grep -v Name)   
          printf '\x45\n' 将16位进制的45转化为字符,结果应为E 
10、awk:好用的数据处理工具,以一行当中分成数个【字段】进行处理
      awk '条件类型1{动作1} 条件类型2{动作2} ... ' filename   (字段的分隔符为空格或tab键)
      last -n 5 将登录者前5行数据取出
      last -n 5 | awk '{print $1 "\t" $3}'   打印  
       NF——字段总数;
       NR——当前第几行
       FS——空格    


      注意:相当于读入第一行,将资料填入$0,$1,$2...等变数当中,$0拥有字段总数。$1每一行账号
      last -n 5 | awk '{print $1 "\t lines:" NR "\t columes:" NF}' 
11、awk的逻辑运算符
      cat /etc/passwd | \
     >awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 显示1和3小于10的字段
      cat /etc/passwd | \
     >awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'   可从第一行开始列出      

    cat Shawn.txt | \
    >awk 'NR==1{printf
    "%10s "%10s "%10s "%10s "%10s\n",$1,$2,$3,$4,"Total"}
    NR>=2{total=$2+$3+$4
    printf"%10d "%10d "%10d "%10d %10.2f\n",$1,$2,$3,$4,total}'
12、档案对比工具:diff(ASCII纯文本)、cmp(比对非纯文本档)
       diff [-bBi] from-file to-file   b忽略一行中有空白的差异/B忽略空白行差异/i忽略大小写
       例1:mkdir -p /tmp/test
           cd /tmp/test
           cp /etc/passwd passwd.old
           cat /etc/passwd | \
           > sed -e '4d' -e '6c no six line' > passwd.new
       例2:diff passwd.old passwd.new     对比档案
            diff /etc/rc3.d/ /etc/rc5.d/   对比目录
     cmp   【字节】的对比 可比较二进制binary
        cmp [-s] file1 file2   列出所有不同的字节处
        cmp passwd.old passwd.new
     patch  升级补丁档
        patch -pN < patch_file         更新      p接[取消几层目录]
        patch -R -pN < patch_file      还原      R代表还原,新变旧
        例1:diff -Naur passwd.old passwd.new > passwd.patch
            cat passwd.patch
        例2:patch -p0 < passwd.patch    同一目录则用0
             patch -R -p0 < passwd.patch
13、档案打印准备:pr
        pr /etc/man.config
14、练习:
        find / -type f | xargs -n 10 grep -l '\*'      xargs可读入标准输入的资料 
    建立新指令与新变量:
        alias myip="ifconfig eth0 | grep 'inet addr' | \
        >sed 's/^.*inet addr://g'| cut -d '' -f1 "
        MYIP=$(myip)
参考数据不延伸阅读
注1:关亍正规表示法不 POSIX 及特殊语法的参考网址可以查询底下的来源: 维基百科的说明:           

     http://en.wikipedia.org/wiki/Regular_expression ZYTRAX 网站介绍:      
     http://zytrax.com/tech/web/regex.htm
 注2:其他关亍正规表示法的网站介绍: 洪朝贵老师的网页:      
     http://www.cyut.edu.tw/~ckhung/b/re/index.php 龙门少尉的窝:      
     http://main.rtfiber.com.tw/~changyj/ PCRE 官方网站:
     http://perldoc.perl.org/perlre.html
 注3:关亍 ASCII 编码对照表可参考维基百科的介绍: 维基百科 (ASCII) 条目:         

    http://zh.wikipedia.org/w/index.php?title=ASCII&variant=zh-tw
 注4:关亍 awk的进阶文献,包括有底下几个连结: 中研院计算中心 ASPAC 计划之 awk 程序介绍:        

    http://phi.sinica.edu.tw/aspac/reports/94/94011/ 鸟哥备份:           

    http://linux.vbird.org/linux_basic/0330regularex/awk.pdf 这份文件写的非常棒!欢迎大家多多参考! 
     Study Area:http://www.study-area.org/linux/system/linux_shell.htm

0 0
原创粉丝点击