您的位置:首页 > 运维架构 > Shell

O'Reilly Sed & Awk 2nd Ed读书笔记(二)

2005-07-25 23:32 260 查看
Chap 2. Understanding Basic Operations

awk源于sed和grep,而后两者又来源于ed,所以首先应该了解ed的基本操作。
ed是一个很简单也很古老的行式编辑器,既支持交互模式,也能使用脚本。它的基本使用方法很简单:
$ed <file>打开一个文件,输出总字符数并停留在最后一行
$p
打印当前行
$d
删除当前行
$数字
跳转到指定行
命令前可以加寻址模式指定操作的行范围,如:
$1d
删除第一行
$/regular/d
删除匹配模式regular的第一行。如果要删除所有匹配的行,则指定前缀g,如:
$g/regular/d
替换命令则更加复杂也更有趣一些,其基本格式为:[addr]s/pattern/replacement/flag
不多解释了,看下面的例子:
s/regular/complex/
替换当前行中匹配的第一个regular为complex
s/regular/complex/g
替换当前行中匹配的所有regular为complex
/regular/s/regular/complex/g
替换匹配regular的第一行中的所有regular为complex。晕了吧?还有这个:
g/regular/s/regular/complex/g
应该很容易猜到什么意思。其实很简单,命令‘s’前面的是地址模式,后面的是替换模式,前后两个‘g’的含义不一样。另外,如果地址中的模式与后面替换的模式相同可以用省略形式:
g/regular/s//complex/g
最后,如果要使用脚本,可以这样:$ed test < ed-script顺便说一下,终于搞清楚了大名鼎鼎的grep的来历,原来是一个ed命令:g/re/p : global regular expression print
哈哈哈

sed与ed不同,它是流式编辑器,命令默认是对所有行适用。比如s/regular/complex/对sed和ed的意义不同。

In ed you use addressing to expand the number of lines that are the object of a command;
in sed, you use addressing to restrict the number of lines affected by a command.

流式的含义:所有字符经处理后都送给标准输出(或指定输出位置)。sed和awk的使用方式很相近:命令模式:command [options] script <inputfile>    or脚本模式:command -f <scriptfile> <inputfile>sed的使用
sed [-e] 'pattern' file使用多个指令时需要指定-e。注意命令行中的pattern最好使用单引号,防止shell对特殊字符进行解释。指定多个命令的方式:
1、使用分号隔开
2、在每个命令前加-e
3、使用shell的多行编辑模式(Bourne shell,C Shell不支持)
sed不修改文件内容,必要时使用重定向保存结果。
-n 选项防止自动输出所有行,仅输出p命令打印的行。
-e -f 可以混用,虽然手册里没有说明。

awk的命令行使用方法与sed大致相同。同时,awk命令与sed的结构差不多,也是由pattern和procedure两部分组成,不同的是procedure不再是单个或多个字符的命令序列,而是命令语句
awk将文件按照分隔符(一般是空格或Tab,连续空白符只算一个,可以指定)分成多个列
$0代表整行,$1、$2、$3分别代表该行的每一个列
awk '{ print $1 }' list
打印第一列

awk '/MA/' list
指定模式,默认动作为打印,即打印匹配到的所有行
awk '/MA/ { print $1 }' list
打印匹配到的行的第一列
-F参数指定分隔符,如 -f, 指定逗号。注意与 -f 区分。
多个语句用分号隔开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息