linux三剑客之sed、awk 3.23

grep在正则表达式中学习过,今天主要讲解另外两个sed和awk

一.sed相关

   sed一次处理一行内容,处理时先将内容存到缓冲区中,然后sed命令处理缓冲区中的内容,处理完之后把这些内容输出到屏幕,再处理下一行,直到文件末尾,原文件内容并没有改变,除非你使用重定向存储输出改变。

   定址:确定行数范围;定界:确定列数范围。

1.sed的命令形式: sed   [选项]  ‘command ’ 文件名         sed   [选项]  -f  scriptfile  文件名

 常用选项: -n∶安静模式。加上 -n 参数后,只有经过sed 特 殊处理的那一行(或者动作)才会被列到屏幕上。

 -e∶直接在指令列模式上进行 sed 的动作编辑;

 -f∶直接将 sed 的动作写在一个档案内,-f filename 则可以执行 filename 内的sed 动作; 

 -r∶支持延伸型正规表示法的语法。(相对于基础正则表达式不需要转义字符"\")

 -i∶直接修改文件内容

 常用命令(也就是'command') 

 a:新增,后面可以接字串,目前的下 一行添加该字符串

 c:取代,后面接字串,这些字串可以取代n1,n2 之间的行(定址的行) 

 d:删除内容

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

 p:列印,即将某个选择的内容打印出来。通常 p 会与参数 sed -n 一起运 作 

 s:替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g (1到20行old替换为new)

2.sed命令的实例

 (1)删除和显示、查询

linux三剑客之sed、awk 3.23

   $表示最后一行。

   使用模式进行查询 

 [[email protected] ruby] # sed -n '/\$/p' ab #查询包括关键字$ 所在所有行,使用反斜线\屏蔽特殊含义

(2)添加

 [[email protected] ruby] # sed '1a drink tea' ab #第一行后增加字符串 “drink tea"

 Hello! 

 drink tea 

 ruby is me,welcome to my blog. 

 end

 [[email protected] ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea" 

 [[email protected] ruby] # sed '1a drink tea\nor coffee' ab #第 一行后增加多行,使用换行符\n 

 Hello! 

 drink tea 

 or coffee 

 ruby is me,welcome to my blog. 

 end

[[email protected] ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"

(3)替换 

 [[email protected] ruby] # sed '1c Hi' ab #ab中第一行代替为Hi 

 [[email protected] ruby] # sed '1,2c Hi' ab  #ab中第一行到第二行代替为Hi 

 替换一行中的某部分      格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串 可以用正则表达式) 

数据的搜寻并执行命令 

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令 ,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行 :

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}' 
1 root:x:0:0:root:/root:/bin/blueshell

二.awk相关

   awk 比较倾 向于一行当中分成数个『字段』来处理。 awk 相当的适合处理小型的数据数据处理。

  1.awk命令形式

    awk [options]   'script'   var=value     file(文件名) 

    awk [options] -f  scriptfile(脚本文件)var=value   file(文件名)

   (1)常用选项[options]

   linux三剑客之sed、awk 3.23

  (2) 一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用 语句块、END语句块3部分组成,这三个部分是可选的。

  linux三剑客之sed、awk 3.23

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在 这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作。

 (3)  awk运行流程:

 第一步:执行BEGIN{ commands }语句块中的语句;

 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重  复这个过程,直到文件全 部被读取完毕。

 第三步:当读至输入流末尾时,执行END{ commands }语句块

(4)awk内置变量

linux三剑客之sed、awk 3.23

    实例:awk ‘END{print NR, $NR}’ filename

    打印最后一行的行号(统计行数)和最后一行的内容

 (5)变量值的传递( -v )

linux三剑客之sed、awk 3.23

 (6)awk的运算和判断:

 linux三剑客之sed、awk 3.23

       awk中的赋值运算和逻辑运算、关系运算和我们之前接触过的语言相同。

       awk中的正则运算

     linux三剑客之sed、awk 3.23


  linux三剑客之sed、awk 3.23

   linux三剑客之sed、awk 3.23


      linux三剑客之sed、awk 3.23

      在linux awk的while、do-while和for语句中允许使用 break,continue语句来控制流程走向,也允许使用exit退出

      awk中,流程控制语句, 语法结构,与c语言类似。

      数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索 引(下标)可以是数字和字符串在awk中数组叫         做关联数组(associative arrays)。

      linux三剑客之sed、awk 3.23

      linux三剑客之sed、awk 3.23