zoukankan      html  css  js  c++  java
  • lesson

    一、sed 
    作用: sed 是一种流编辑器,它是文本处理中非常重要的工具, 能够完美的配合正则表达式使用。处理时,把当前处理的行存储在临时缓冲区中, 称为“模式空间(pattern space)”,接着用sed 命令处理缓冲区中的内容, 处理完成后, 把缓冲区中的内容送往屏幕。 接着处理下一行,不断重复, 直到文件末尾。 文件内容并没有改变,除非你使用重定向存储输出。sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作; 编写转换程序等。
    命令格式:
    sed [options] 'command' file(s)
    sed [options] -f scriptsfile file(s)

    选项:

    -e <script> --expression : 以选项中的指定script来处理输入的文本文件
    -f <script> --file :以选项中指定的script 文件来处理输入的文本文件
    -n --quiet : 仅显示script处理后的结果

    sed 命令:

    a 在当前行下面插入文本
    i 在当前行上面插入文本
    c 把选定的行改为新的文本
    d 删除,删除选择的行
    D 删除模板块的第一行
    s 替换指定字符
    h 拷贝模块板的内容到内存中的缓冲区
    H 追加模板块的内容到内存中的缓冲区
    g 获得内存缓冲区的内容,并替代当前模板块中的文本。
    G获得内存缓冲区的内容,并追加当前模板块中的文本。 
    l 列表不能打印字符的清单。
    n 读取下一个输入行, 用下一个命令处理新的行而不是第一个命令。
    N 追加下一个输入行到模板块并在两者间嵌入一个新行,改变当前行号码
    p 打印模板块的行
    P 打印模板块的第一行
    q 退出sed 
    b label 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
    r file 从file中读行
    t lable if 分支,从最后一行开始,条件一单满足,将导致分支到带有标号的命令处,或者到脚本的末尾
    Tlabel 错误分支,从最后一行开始,一单发生错误,将导致分支到带有标号的命令处,或者脚本的末尾
    w file 写并追加模板块到file 末尾
    W file 写并追加模板板块的第一行到file末尾
    ! 表示后面的命令对所有没有选定的行发生作用
    = 打印当前行号码
    # 把注释扩展到下一个换行符以前、

    sed 替换标志

    g 表示行内全面替换
    p 表示打印行
    w 表示把行写入一个文件
    x 表示互换模板块中的文本和缓冲区中的文本
    y 表示把一个字符翻译为另外的字符(不用于正则表达式)
    1 子串匹配标记
    & 已匹配字符串标记

    sed 元字符集

    ^ 匹配行开始, 如: /^sed/ 匹配所有以sed开头的行
    $ 匹配行结束, 如:/sed$ / 匹配所有以sed 结尾的行
    . 匹配一个非换行符的任意字符, 如: /s.d/ 匹配s 后接一个任意字符,最后是d 
    * 匹配0 个或多个字符, 如:/s*ed/ 匹配0个或多个s 字符, 最后是ed 
    ? 匹配0个或一个字符, 如:/s? ed/ 匹配 0个或一个s 字符,最后是ed 
    [] 匹配一个指定范围内的字符,如/[sS] ed / 匹配 sed 或Sed
    [^] 匹配一个不再指定范围的字符,如: /[^A-RT-Z]ed/ 匹配不包含A-R T-Z 的一个字母开头,后面是ed
    (..) 匹配子串,保存匹配的字符, 如:/s/(love)able/1rs , loveable 被替换成lovers
    & 保存收缩字符用来替换其他字符,如:s/love/**&**/,  love 替换成 **love**.
    < 匹配单词的开始, 如:/<love/ 匹配包含以love 开头的单词的行
    > 匹配单词的结束, 如:/love>/ 匹配包含以love 结束的单词的行
    x{m} 重复字符x ,m 次,如 :/0{5} 匹配包含5个0 的行
    x{m,} 重复字符x ,至少m 次, 如:/0{5,} 匹配包含至少5个0 的行
    x{m,n} 重复字符x, 至少m 次,不多于n次 , 如:/0{5,10} 匹配包含5-10 个0的行

    sed 用法实例

    替换文本中的字符串
    sed 's/book/books/' file 
    -n p 一起使用表示只打印那些发生替换的行
    sed -n 's/test/TEST/p' file
    直接编辑文件选项-i ,会匹配文件中每一行的第一个book 替换成books 
    sed -i 's/book/books/g' file
    当需要从第N处匹配开始替换时,可以使用/NG;
    echo sksksksksksksk |sed 's/sk/SK/2g'
    skSKSKSKSKSKSK
    echo sksksksksksksk |sed 's/sk/SK/3g'
    skskSKSKSKSKSK
    echo sksksksksksksk |sed 's/sk/SK/4g'
    skskskskSKSKSK

    定界符

    命令中字符/在sed中作为定界符使用,也可以使用任意的定界符
    sed 's:test:TEST:g'
    sed 's|test|TEST|g'
    定界符出现在样式内部时,需要进行转义
    sed 's//bin//user/local/bin/g'

    删除操作

    删除空白行
    sed '/^$/d' file
    删除空格行
    sed '/^ $/d' file
    删除文件第二行
    sed '2d' file
    删除文件第二行至末尾所有行
    sed '2,$d' file
    删除文件最后一行
    sed '$d' file
    删除文件中所有开头是test 的行
    sed '/^test/'d file  / sed '/^test/d' file
    已匹配字符串标记&
    正则表达式w+ 匹配每一个单词,使用[&] 来替换它, &对应于之前匹配到的单词
    echo this is a test line| sed 's/w+[&]/g'
    [this][is][a][test][line]
    所有以192.168.0.1开头的行都会被替换成它自己加localhost 
    sed 's/^192.168.0.1/&localhost/' file
    192.168.0.1localhost

    子串匹配标记1

    匹配给定样式中的其中一部分
    echo this is a digit 7 in a number | sed 's/digit ([0-9])/1/'
    this is 7 in a number
    echo aaa BBB | sed 's/([a-z]+) (A-Z]+) /2 1/'
    BBB aaa

    组合多个表达式

    sed '表达式1' | sed '表达式2' 
    sed '表达式1;表达式2'

    引用

    sed 表达式可以使用单引号来引用,但是如果表达式内容包含变量字符串,就需要使用双引号
    test =hello
    echo hello world | sed “s/$test/HELLO"
    HELLO world

    选定行的范围: , 逗号

    所有在模板块test 和check 所确定的范围内的行都被打印
    sed -n '/test/,/check/p' file
    打印从第五航开始到第一个包含以test开始的行之间的所有行
    sed -n '5,/^test/p' file
    对于模板块test 和 west 之间的行, 每行的末尾用字符串aaa bbb 替换
    sed '/test/,/west/s/$/aaa bbb/' file

    多点编辑: e命令

    -e 选项允许在同一行里执行多条命令
    sed -e '1,5d' -e 's/test/check/' file   或  sed --expression='s/test/check/' --expression='/love/d' file

    从文件读入: r命令

    file 里的内容被读进来,显示在与test匹配的行后面,如果匹配多行, 则file的内容将显示在所有匹配行下面。
    sed '/test/r file' filename

    写入文件: w 命令

    在example中所有包含test的行都被写入到file里
    sed -n '/test/w file' example   file中原有数据被覆盖。

    追加(行下) a 命令

    将this is a test line 追加到以test 开头的行后面
    sed '/^test/a his is a test line' file
    在test.conf 文件第二行之后插入this is a test line
    sed -i '2a his is a test line' test.conf    (-i 写入文件   不加则临时写入)

    插入(行上) i 命令

    sed '/^test/i his is a test line' file  不写入
    sed -i  '5i his is' file    写入第五航之前
    变形: y 命令
    把1-10行内所有的abcde 转换为大写,注意,正则表达式元字符不能使用此命令
    sed '1,10y/abcde/ABCDE' file  单独修改每一个字符

    退出: q 命令

    打印完第十行之后,退出
    sed '10q' file

    保持和获取: h G 命令

    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中, 除非行被删除或者输出被取消, 否则所有被处理的行都将被打印在屏幕上, 接着模式空间被清空, 并存如新的一行待处理.
    任何包含test的行都将被复制并追加到文件末尾
    sed -e '/test/h' -e '$G' file
    保持和互换 : h x 命令
    互换模式空间和保持缓冲区的内容,也就是把包含test 和check 的行互换
    sed -e '/test/h' -e '/check/x' file

    脚本scriptfile

    sed 脚本是一个sed的命令清单, 启动sed时以-f 选项引导脚本文件名, sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令。 要用分号分隔。 以#开头的行为注释行,不能跨行
    sed [option] -f scriptfile files
    打印奇数行或偶数行
    sed -n 'p;n' test  奇数
    sed -n 'n;p' test  偶数
    sed -n '1~2p' test 奇数
    sed -n '2~2p' test 偶数

    打印匹配字符串的下一行

    grep -A 1 SCC URFILE
    sed -n '/SCC/{n;p}' URFILE
    awk '/SCC/{getline;print}' URFILE

    二、awk 

    作用:awk 是一种编程语言, 用于在linux/unix 下对文本和数据进行处理。 数据可以来自标准输入(stdin),一个或多个文件, 或其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能, 是linux/unix下的一个强大编程工具。它在命令行中使用, 但更多是作为脚本来使用。 awk 有很多内建的功能, 比如数据,函数等。 这是它和C语言的相同之处。 
    awk 命令格式和选项
    语法形式:
    awk [options] 'script' var=value file
    awk [options]  -f scriptfile  var=value file
    常用命令选项:
    -F fs 指定输入分隔符,  fs 可以似乎字符串或正则表达式
    -v var=value 赋值一个用户定义变量,将外部变量传递给awk 
    -f scriptfile 从脚本文件中读取awk 命令
    awk 模式和操作
    awk 脚本是由模式和操作组成的
    *模式可以是一下任意一个
    /正则表达式/: 使用通配符的扩展集
    关系表达式: 使用运算符进行操作, 可以是字符串或数字的比较测试
    模式匹配表达式: 用运算符~ 匹配 ~! 不匹配
    BEGIN 语句块、pattern语句块、END语句块
    *操作
    操作由一个或多个命令,函数,表达式组成,之间用换行符或分号隔开, 并位于大括号内,主要部分是:
    变量或数组赋值 , 输出命令, 内置函数, 控制流语句
    awk 脚本基本结构
    awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    awk "BEGIN{ i=0} {i++} END{ print i}" file
    awk 'BEGIN{ i=0} {i++} END{ print i}' file
    一个awk 脚本通常由: BEGIN语句块,能够使用模式匹配的通用语句块,END语句块3本分组成, 这三个部分是可选的。任意一部分都可以不出现在脚本中, 脚本通常是在单引号或双引号中。
    awk 的工作原理
    awk 'BEGIN{ commands} pattern {commands} END{ commands}'
    第一步:执行BEGIN{ commands} 语句块中的语句
    第二部: 从文件或标准输入(stdin)读取一行, 然后执行pattern {commands} 语句块,它逐行扫描文件,从第一行到最后一行重复这个过程, 知道文件全部被读取完毕
    第三部: 当读取至输入流末尾时, 执行END{commands}语句块
    BEGIN: 在awk 开始从输入流中读取行之前被执行, 这是可选语句块 , 比如变量初始化,打印输出列表的表头等语句通常可以写在BEGIN语句块中
    pattern: 通用命令是最重要的部分,它也是可选的, 如果没有提供pattern 与句酷,则默认执行{pring},即打印每一个读取到的行,awk 读取的每一行都会执行该语句块
    END: 在awk输入流读取完所有的行之后即被执行,比如所有行的汇总信息都是在END语句块中完成 ,可选
    实例:
    echo -e "A line 1 A line 2" | awk 'BEGIN{ print "start"} {print} END{print "end"}'
    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' 
    v1 v2 v3
    当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用
    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
    双引号拼接使用
    awk 内置变量:
    说明:【A】awk 【N】nawk【P】POSIXawk【G】gawk 表示第一个支持变量的工具
    $n 当前记录的第n个字段, 当n =0 时包括整行
    [N] ARGC 命令行参数的数目
    [G] ARGIND 命令行中当前文件的位置 从0 开始算
    [N] ARGV 包含命令行参数的数组
    [G] CONVFMT 数字转换格式(默认值%。6g)
    [P] ENVIRON 环境变量关联数组
    [N] ERRNO 最后一个系统错误的描述
    [G] FIELDWIDTHS 字段宽度列表 (空格键分隔)
    [A] FILENAME 当前输入文件的名
    [P] FNR 同NR 但相对于当前文件
    [A] FS 字段分隔符(默认是空格)
    [G] IGNORECASE 如果为真, 则进行忽略大小写的匹配
    [A] NF 表示字段数, 在执行过程中对应于当前的字段数
    [A] NR 表示记录数, 在执行过程中对应于当前的行号
    [A] OFMT 数字的输出格式(默认是%。6g)
    [A] ORS 输出记录分隔符 (默认是一个换行符)
    [A] OFS 输出字段分隔符(默认是一个空格)
    [A] RS 记录分隔符(默认是一个换行符)
    [N] RSTART  由match 函数所匹配的字符串的第一个位置
    [N] RLENGTH 由match 函数所匹配的字符串长度
    [N] SUBSEP 数组下标分隔符(默认值是34)
    实例:
    *echo -e "line1 f2 f3 line2 f4 f5 line3 f6 f7" | awk '{print "line No:"NR",No of fields:"NF,"$0="$0."$1="$1,"$2="$2,"$3="$3}'
    Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
    Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
    Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7
    *echo -e "line1 f2 f3 line2 f4 f5" | awk '{print $NF}'
    print $NF 可以打印出一行中的最后一个字段, 使用$(NF-1) 是打印倒数第二个字段。
    *echo -e "line1 f2 f3 line2 f4 f5" | awk '{print $2,$3}'
    打印每一行的第二和第三个字段
    *awk 'END{ print NR}' filename
    统计文件中的行数
    *seq 5 | awk 'BEGIN{ sum=0; print "总和:"} {print $1"+"; sum+=$1} END{print "等于"; print sum}'
    每行第一个字段值累加
    将外部变量值传递给awk 
    借助-v 选项,可以将外部值(并非来自stdin) 传递给awk
    VAR=1000
    echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
    awk 运算与判断
    作为一种程序设计语言所应具有的特点之一, awk 支持多种运算, 这些运算与C语言提供的基本相同。awk 还提供了一系列内置的运算函数(如 log ,sqr ,cos,sin) 和一些对于字符串进行操作的函数(length,substr) 。这些函数的引用大大的提高了awk 的运算功能。 作为对条件转移指令的一部分, 反洗判断是美中程序设计语言都具备的功能, awk 也不例外,awk中允许进行多种测试, 作为样式匹配, 还提供了模式匹配表达式~ (匹配)和~! (不匹配) 。 作为对测试的一种扩充,awk 支持用逻辑运算符。
    *算术运算符:
    +  -    : 加减
    * / &:乘除 求余
    + - ! : 一元加,减和逻辑非
    ^***  : 求幂
    ++ -- : 增加或减少, 作为前缀或后缀 
    例: awk ‘BEGIN{ a=0; print  a++,++a;}'
      0  2 
      a++  : 先输出,再自加1,
      ++a  : 先自加1,再输出,
     所有用做算术运算符进行操作, 操作数自动转为数值, 所有非数值都变为0 
    *赋值运算符
    =  +=  -=  *=  /=  %=   ^=   **=     赋值语句
    例: a+= 5;   a=a+5;
    *逻辑运算符
    ||  或
    && 与
    例: awk 'BEGIN{ a=1;b=2; print (a>5 &&b<=2), (a>5) || b<=2);}'   
    0   1
    *正则运算符
    ~   ~!
    例: awk 'BEGIN{ a="100test"; if(a ~ /^100*/) {print "ok" ;} }'
    *关系运算符
    <  <=  >  >=  !=   ==  关系运算符
    例: awk 'BEGIN{ a=11; if (a>9) {print "ok"}}'
    >< 可以作为字符串比较,也可以用作数值比较, 关键看操作数如果是字符串就会转换为字符串比较。 两个都为数字才转为数值比较。  字符串比较: 按照ASCII 码顺序比较。
    * 其他运算符
    $ 字段引用
    空格 字符串连接符
    ?:  c条件表达式
    in 数组中是否存在某键值
    例: awk 'BEGIN{a="b"; print a=="b"? "ok":"err";}'
            awk 'BEGIN{a="b"; arr[0]="b"; arr[1]="c" ; print (a in arr);}'    打印所在数组位置0  
    * 运算级优先级表
    1 =,+=,-=,*=,/=, &=,^=,|=,<<=,>>=   赋值,运算
    2 ||    逻辑或
    3 && 逻辑与
    4 |      按位或
    5 ^    按位异或
    6 &    按位与
    7 ==,!=  等于, 不等于
    8 <= ,>=,<,>  小于等于,大于等于,小于,大于
    9 << ,>>  按位左移, 按位右移
    10 +,-   加 减
    11 *,/, % 乘除取余
    12 !,~  逻辑非,按位取反或补码
    13 -,+ 正,负
    级别越高越优先
    awk 高级输入输出
    读取下一条记录, awk 中next 语句使用: 在循环逐行匹配, 如果遇到next ,就会跳过当前行, 直接忽略下面语句, 进行下一条语句。 
    awk 'NR%2==1{next}{print NR, $0;}' test.txt,奇数行跳过,偶数行打印
    awk '/^web/{T=$0;next;} {print T ": " $0;}'  test.txt    将包含web 行进行跳过,与下面不包含web 行合并
    设置字段定界符
    默认的字段定界符(分隔符)是空格, 可以使用-F "定界符" 明确指定一个定界符
    awk -F : '{ print $NF }' /etc/passwd
    awk 'BEGIN{FS=":" } {print  $NF}'  /etc/passwd
    简单读取一条记录
    awk getline 用法: 输出重定向需用到 getline 参数。 getline 从标准输入,管道或者当前正在处理的文件之外的其他文件获得输入。 它负责从输入获得下一行的内容, 并给NF,NR 和FNR等内建变量赋值。 如果得到一条记录,getline 函数返回1 , 如果到达文件的末尾就返回0 ,  如果出现错误,则返回-1 。
  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/LinuxSuDa/p/4432660.html
Copyright © 2011-2022 走看看