• 鸟哥的linux私房菜——第12章 正则表达式与文件格式化处理


    12.1什么是正则表达式

    正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。

    vi、grep、awk、sed支持正则表达式,而cp,ls等命令只能使用bash自身的通配符

    12.2基础正则表达式

    grep高级参数:

    grep [-A] [-B] [--color=auto]  'string'   filename

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

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

    --color=auto 可将正确的那个选取数据列出颜色

    基础正则表达式练习:

    例一:查找特定字符串

    grep -n ‘the’ regular_express.txt

    grep -vn 'the' regular_express.txt   (-v反向选择)

    例二:利用中括号[]来查找集合字符

    grep -n 't[ae]st' regular_express.txt  (可匹配test或tast)

    grep -n '[^g]oo' regular_express.txt  (oo前不能有g的字符)

    grep -n '[^[:lower:]]oo' regular_express.txt   ([:lower:]代表a-z的意思)

    例三:行首和行尾字符

    grep -n '^test' regular_express.txt

    (注:^在[]内表示“反向选择”,在[]外表示定位在行首)

    grep -n '.$' regular_express.txt   (找出行尾结束为小数点的那一行)

    例四:任意一个字符.与重复字符*

    grep -n ‘g..d’ regular_express.txt   (可匹配good,glad等字符)

    grep -n 'ooo*' regular_express.txt   (匹配至少两个o以上的字符)

    grep -n 'g.*g' regular_express.txt    (找出g开头与g结尾的字符串,.*表示o个或多个任意字符的意思)

    例五:限定连续RE字符范围{}

    grep -n 'o{2}' regular_express.txt  (找出两个o的字符串)

    grep -n ‘go{2,5}g’ regular_express.txt  (g后有两个到5个o,然后接一个g的字符串)

    grep -n ‘go{2,}g’ regular_express.txt  (g后有两个及以上的o,然后接一个g的字符串)

    基础正则表达式字符:

    ^word :待查找的字符串(word)在行首

    word$ :待查找的字符串(word)在行尾

    . :代表一定有一个任意字符的字符

      : 转义字符,将特殊符号的特殊意义去除

    *  : 重复0个或多个的前一个字符

    [list] :从字符集合的RE字符里面找出想要选取的字符

    [n1-n2]:从字符集合的RE字符里面找出想要选取的字符范围

    [^list] :从字符集合的RE字符里面找出不要的字符串或范围

    {n,m}:连续n到m个的前一个RE字符,{n}表示连续n个,{n,}表示连续n个及以上

    sed工具:(详见sed & awk)

    格式:sed [-nefr] [动作]

    参数:

    -n :使用安静模式,在一般的sed用法中,所有来自STDIN的数据一般都会被列到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来

    -e :直接在命令行模式上进行sed的动作编辑

    -f  :直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作

    -r  :sed的动作支持的扩展型正则表达式的语法

    -i  :直接修改读取的文件内容,而不是由屏幕输出

    动作说明:[n1,[n2]] function

    n1,n2不见得会存在,一般代表选择进行动作的行数

    function参数:

    a :新增,a的后面可以接字符串,而这些字符串会在目前的下一行出现

    i  :插入,i 的后面可以接字符串,而这些字符串会在目前的上一行出现

    c :替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行

    s :替换,可以直接进行替换工作,通常这个s可以搭配正则表达式

    d :删除,因为是删除,所以d后面通常不接任何参数

    p :打印,也就是将某个选择的数据打印出来,通常p会与参数sed -n一起运行

    12.3扩展的正则表达式

    + :重复一个或多个的前一个RE字符

    ? :0个或一个的前一个RE字符

    |  :用或的方式找出字符串

    () :找出“组”的字符串  (如:egrep -n ‘g(la|oo)d’ regular_express.txt  表示找出glad或good字符串)

    ()+:多个重复组的判别   (如echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'  找出开头是A结尾是C,中间有一个以上的“xyz”字符串)

    12.4文件的格式化与相关处理

    格式化打印 printf:

    格式:printf '打印格式' 实际内容

    格式方面的几个特殊样式:

      a 警告声音输出

       退格键

      f 清除屏幕

       输出新的一行

       亦即Enter按键

       水平的tab按键

      v 垂直的tab按键

      xNN NN为两个数字,可以转换数字成字符

    关于C语言内,常见的变量格式

      %ns :n代表数字,s代表string,即多个字符

      %ni : n代表数字,i代表interger,即多少整数字数

      %N.nf :n和N都是数字,f代表float,如十个位数,小数点两位为 %10.2f

    awk工具 (详见sed & awk):

    格式:awk ‘条件类型1{动作1} 条件类型2{动作2} ...’ filename

    awk主要是处理每一行的字段内的数据,而默认的字段的分割符为空格键或tab键

    变量:

    NF : 每一行($0)拥有的字段总数

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

    FS :目前的分隔字符,默认是空格键

    逻辑运算符:

    >  <  >=  <=  ==  !=

    例:

    cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 " " $3}'

    cat pay.txt | awk '{if(NR==1) printf "%10s %10s,%10s ",$1,$4,"Total"} NR>=2 {total=$1+$4 printf "%10s %10d %10.2f ",$1,$3,total}'

    文本比较工具diff:

    diff用于比较两个文件之间的区别,并且是以行为单位的,diff也可以比较两个目录

    格式:diff [-bBi] from-file to-file

    -b :忽略一行当中仅有多个空白的区别(如“about me”和“about           me”视为相同)

    -B:忽略空白行的区别

    -i:忽略大小写的区别

    patch -pN <patch_file  更新

    patch -R -pN <patch_file   还原

    范例:以/tmp/test内的passwd.old 与passwd.new 制作补丁文件,并更新旧版数据

    diff -Naur passwd.old passwd.new >passwd.patch

    更新旧文件,变成和新文件一样

    patch -p0 <passwd.patch

    (pathing file passwd.old)

    恢复旧文件的内容

    patch -R -p0 <passwd.patch

    文件打印pr:

    pr /etc/man.config  (打印文本文件man.config)

  • 相关阅读:
    定义通用类型,便于移植和32位、64位的编译
    映射密码的加密,解密以及暴力破解
    位移密码的加密,解密以及暴力破解
    TCP三次握手和四次挥手通俗理解
    git常用命令
    pip及npm换源
    win10安装Docker并换国内源
    搜索引擎工作原理
    wsgi_uwsgi_nginx理论知识
    课程全文检索接口
  • 原文地址:https://www.cnblogs.com/brucee/p/3907719.html
Copyright © 2020-2023  润新知