sed & awk 手写

sed & awk 手记

 

本文为sed&awk脚本学习的手记,有些杂乱。

 

sed & awk 是流编辑器,也是模式匹配编程语言。

    awk, sed,以及grep,源自ed,UNIX原始的行编辑器。
    理解awk和sed的关键在于, sed和awk处理的对象是流(stream),按行(line)进行处理。sed&awk的另外一个重要部分是模式匹配。流处理和模式匹配可以说是sed和awk的核心概念 ,理解了这两点,sed和awk的基础就没问题了。Sed处理过程如图一所示。
sed & awk 手写

图一 sed处理过程。


awk处理过程如图二所示:
sed & awk 手写

图二 awk处理过程。

sed 命令基本应用格式:

sed [OPTION] ... {script-only-if-no-other-script} [input-file]...

    -n 禁止sed输出到标准输出
    -i 更改操作到原始文件
    -e script, --expression=script
            把脚本添加到执行的命令中,即一次可以执行通过-e选项执行多条命令。
    -f script-file,--file=script-file
            把script-file的内容添加到执行的命令中。通过脚本执行sed。

    -r, --regexp-extended
        使用脚本中扩展的正则表达式。
    -s, -- separate
        把文件看做独立的,而不是一个长的连续流。

    -u,--unbuffered

    如果没有-ef,--expression,-f,或者--file选项,则第一个非选项参数视为sed脚本进行解释。剩余的参数为输入的文件,如果没有输入的文件,则从标准输入读取。


awk 基本应用形式:
awk [ options ] -f program-file [ -- ] file …
其中比较常用的options的命令:
-F  指定字段分割符,例如:
       awk -F ; '{ print $1}' list

$1,2,3... 行内的第几个字段指示符


-v var=value, 变量定义
       变量不需要初始化,awk的变量初始化为空字符串。





    对于sed的脚本而言,首先它是默认全局处理的,即对于流的每一行都会进行处理。

sed的基本命令

    sed命令集含有25个命令。
    sed命令格式:
    [address] command
        address可以是一个/正则表达式/,行号,行地址符号,或者是逗号分割的行地址范围。

    个别的命令不能接受行地址范围:
    [line-address] command


    某些命令可以组合接受同一个地址:
    [address]{
        command1
        command2
        command3
}
    可以将command1写在{行上,但是右括号(})必须单独成行。每个命令可以有自己的地址,任意层次的组合关系。

注释
        #n, 等同于-n,必须是文件的前两个字符。


替换命令
    [address]s/pattern/replacement/flags

    flags:
        n --替换掉第n个匹配项。
        g --全局替换,一般是第一个匹配项
        p --打印匹配空间的内容
        w file -- 将模式匹配内容写到file。

    和地址不一样,正则表达式除了新行符外都可以作为分隔符。如:
        s!/usr/mail!/usr2/mail!

    在replacement部分,以下字符有特殊含义:
    & 指代正则表达式的匹配的字符串(pattern)
    \n 匹配pattern指明的第n个子字符串,通过括号(),最多可以指定9个,n为1-9的数字
    \ 转义符

删除命令
    d
    /^$/d 删除空白行
   
增加,插入和修改
    append[line-address]a\
    text
    insert[line-address]i\
    text
    change[address]c\
    text

list命令
    显示模式空间的内容,对于不能打印的字符用2进制ASCII码表示。
转换命令
y
打印命令
p
打印行号
地址后面跟一个=,打印行号

[line-number]=

next 命令
n

读写文件
[line-address]r file
[address]w file

quit命令
停止命令q

高级sed命令
所谓sed的高级命令,可以理解为sed的扩展,因为sed本质上是行处理的流编辑器,但是也有跨行处理,指令控制的需求,因此所谓的高>级命令就是使sed可以进行多行处理,缓存处理行空间,以及分支和条件处理的指令。

1. 多行模式
       N,D,P
2. 缓存一行
    H,h,G,g, x
3. 分支处理和条件处理,:,b,t

   

awk 脚本
    awk语言是属于POSIX标准的。原始的awk是一种漂亮的小语言,1978年左右在UNIX V7中出现。1989年,awk 为 System V Release 4进行
了更新。这一版也提供了POSIX标准的基准功能列表。

awk 是输入驱动的。   
系统数组变量
ARGV, 参数数组
ENVIRON, 环境变量数组