12.正则表达式

来源:互联网 发布:java asm 中文文档 编辑:程序博客网 时间:2024/06/05 05:54

1.基础正则表达式

①grep的一些高级参数

   -An:after的意思,除了列出该行外,后续的n行也列出来

   -Bn:befer的意思,除了列出该行外,前面的n行也列出来

   --color:颜色选项(alias grep=‘grep --color=auto’,可以直接在~/.bashrc内加入此行,“source~/.bashrc”生效)

   -n:输出行号

    -v:反向输出

    -i:忽略大小写

②其他用法

    ----中括号的用法:grep -n 't[ae]st' xx.txt    ;中括号内有几个字符,都只代表一个字符,表示寻找tast或者test

    ----寻找某个字符:grep -n 'oo' xx.txt   ;xx.txt中查找含有oo的字符串

    ----反向选择:grep -n '[^g]oo' xx.txt  ;查找不是以g开头,但第二三位是oo的字符串

                           grep -n '[^a-z]oo' xx.txt  ;查找不是以小写字母开头,但第二三位是oo的字符串

    ----行首字符:grep -n '^the' xx.txt  ;查找开头为the的字符串

                            greo -n ‘^[a-z]’xx.txt  ;查找开头为小写的字符串

     备注:^在[]内代表反向选择,^在[]外代表定位首字符的意义。

    ----结束行尾字符:grep -n '\.$' xx.txt  ;查找以.结尾的行尾(.一般都有特殊意义,需要用\解除其特殊意义)

    ----找出空白行:grep -n '^$' xx.txt  ;查找空白行

                               grep -nv  '^$' /etc/syslog.conf | grep -v '^#'在脚本文件中,输出不含空白行,不含#注释行

    ----任意字符:.点代表任意字符,一个.代表一个任意字符,两个..代表两个任意字符,如:grep -n 'g..d' xx.txt 找gd之间有2个字符的字符串

    ----重复字符:*代表重复0个或多个*前面的字符(0个或多个),那么o*代表0个或多个o;oo*代表1个或多个o.......

                             grep -n 'gooo*g' xx.txt 查找g开头结尾,中间至少有二个o的字符串

                             grep -n '[0-9][0-9]*' xx.txt  ;查找任意数字

        表示0个或任意多的字符串,用   .*   表示,如需要g.....g,则可以写:‘g.*g’

    ----限定连续字符串:x\{m,\}y    grep -n 'go\{2,\}g' xx.txt   查找含有2个以上的o的字符串,只是2个以上o,不是go

                                      x\{m,\n}y     grep -n 'go\{2,\5}g' xx.txt  查找含有2个以上5个以下o的字符串

2.sed工具

   sed [-nefr] [动作([n1][,n2]动作 动作参数)]   n1 n2 代表选择行进行动作

   如:

①删除:nl /etc/passwd | sed '2,5d'  d-删除,打印行号,并删除2-5行

              nl /etc/passwd | sed '2d'  只删除第二行

              nl /etc/passwd | sed '2,$d' 删除第二行到最后一行

②增加:nl /etc/passwd | sed '2a xxxxxxxxxxxxxx' 2a:在第二行下面一行增加xxxxxxxxxxx,也就是增加到第三行

                                                      i                                  i                 上面                                                               二

          增加两行:nl /etc/passwd | sed '2a xxxxxxxxxxxxx \

                           >yyyyyyyyyyyy'                  带一个反斜杠\就可以增加2行

③替换: nl /etc/passwd | sed '2,5c NO 2-5 NUMBER'  把第二至第五行替换为NO 2-5 NUMBER

             部分数据的查找并替换:sed 's/要被替换的字符串/新的字符串/g'  g代表逐行

④显示: nl /etc/passwd | sed -n '5,7p' 只显示5-7行, p通常会与sed -n 一起运用,-n安静模式,不加-n会全部输出

有个实例,查找ifconfig eth0 只输出 ip字符,原 行为 :inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0

则:/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | 'sed 's/Bcast.*$//g'   (注意.*代表0至多个)

⑤直接修改文件内容 -i        sed -i 's/要被替换的字符串/新的字符串/g

3.awk

①格式化打印printf(类似c语言的格式输出

   printf  '%10s %5i %8.2f \n'  $ (cat xx.txt | grep -v Name)   

        s--string    i---int    f---float     \n 分行字符

②awk:sed常用于一整行的处理,awk更倾向于把行分为数个“字段”来进行处理

    如需要取得账号与登录者ip,则:    last-n 5 | awk '{printf $1 "\t" $3}'      $1 代表第一列 $0 代表一整行的意思 单引号内引用啥的套双引号

③awk的内置变量(引用内置变量无需加$)

    ----NF:每一行拥有的字段总数

    ----NR:目前awk所处理的是“第几行”的数据

    ----FS:目前的分割字符,默认是空格,可以自己设定,如:FS=":"

④awk的逻辑运算

    ==  等于,习惯上一个等于号=是赋值的意思

    !=不等于

有个问题:关于在更改默认分割字符的时候即FS=""其他的时候,第一行不生效的问题

    如:cat /etc/passwd | awk '{FS=":"} $3<10 {printf $1 "\t" $3}'  显示第一列账号及第三个字段小于10的UID,

    因为awk的工作流程是首先读入第一行,然后把数据填入$0,$1,$2等变量中,,这个例子在读入第一行的时候默认的分隔符还是空格,

           所以第一列就无法按照需求显示,可以增加BEGIN关键字

            cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {printf $1 "\t" $3}'    那么第一行字段就能按要求显示。

4.文件比较工具

①diff   diff 欲比较的文件名 目的比较的文件名

    -b 忽略一行当中仅有多个空白的区别

    -B 忽略空白行的区别

    -i  忽略大小写的区别

②cmp 以字节为单位进行比较,diff一般以行为单位

③patch :升级

   diff -Naur passwd.old passwd.new > passwd.patch  比较不同,生成.patch文件

   更新:patch -pN < patch_file

   还原:patch -R -pN < patch_file   -p代表后面的N消除几成目录的意思

    如:patch -p0 < patchwd.patch  更新成新数据

           patch -R -p0 < patchwd.patch  还原成旧数据

5.文件打印准备 :pr ,如:pr /etc/man.config  可以增加时间 文件名 页码 这样的 页眉项

0 0
原创粉丝点击