[笔记] sed and awk

/ awk程序的典型示例是将数据转换成格式化的报表,当数据拥有某种结构时就能最好的体现awk的好处;可以使用awk脚本对数据的列重新排序,甚至可以将列变成行以及将行变成列;awk的功能将文本编辑的思想扩展到计算,使他有可能执行各种数据处理任务,包括分析、提取和数据报告。

/ 使用sed,必须了解一组单字母的命令;使用awk们必须了解程序设计语言的语句;

/ sed和awk都是从文本文件中一次一行的读取输入,并将输出直接送到标准输出端;区别在于他们控制所做的工作时所用的指令不同,这是一个主要的区别,而且这影响了这些程序最适于处理的任务类型。

/ awk起源于sed和grep,而不是ed(grep和sed起源于ed);

/ ed中's/regular/complex/'由于没有指定地址,所以他只影响当前行上的第一次出现,为了寻找同一行上的多次出现,必须指定g作为标志:'s/regular/complex/g';必须指定地址从而使该命令不只是对当前行操作:'/regular/s/regular/complex/g',这个命令影响文件中与这个地址匹配的第一行;要将他应用于所有的行,必须使用全局命令,即在地址前放置g:'g/regular/s/regular/complex/g';如果地址与模式相同,那么可以通过指定两个连续的丁姐夫(//)来告诉ed:'g/regular/s//complex/g';

/ grep来源于ed中的全局命令:'g/re/p',他表示“全局正则表达式打印”,grep是从ed中提取并可用作外部程序的行编辑命令,他将正则表达式作为命令行上的一个参数并将它用作要打印的行的地址;

/ sed命令是隐式的全局命令,在ed中,使用寻址扩大受命令影响的行数;在sed中,使用寻址限制受命令影响的行数;

/ awk与sed不同的地方是他废弃了行编辑器的命令集,它提供了效仿C语言的程序设计语言,例如,print语句取代p命令;但延续了寻址的概念,例如:'/regular/ {print}'

/ 在sed和awk中,每个命令都包括两部分:模式和过程,模式是由斜杠(/)分割的正则表达式,过程指定一个或多个将被执行的动作;当所有可用指令被解释并应用于单个行后,sed输出该行并循环处理每个输入行;而awk不自动输出,脚本中的命令控制awk最终所做的事情;

/ 3种指定命令行上的多重指令:1.用分号分割命令 sed 's/MA/ma/;s/PA/pa/' file 2.在每个指令前放置-e:sed -e 's/MA/ma/' -e 's/PA/pa/' file 3.在输入单引号后按ENTER键;

/sed中 -n选项可以阻止自动输出,当指定该选项时,每个要生成输出的指令都必须包括打印命令p;

/ awk中一个或多个连续的空格或制表符被看做一个定界符,awk允许在模式或过程中引用这些字段:$0表示整个输入行,$1、$2、……表示输入行上的各个字段;

/ 基本的元字符集是由ed引入的,而且在grep中可用,sed使用相同的元字符集;awk基本上使用与egrep相同的扩展的元字符集;

/ 基本元字符集:. * [] ^ $ \{n,m\} \(转义后面的特殊字符)

扩展的元字符集(egrep/awk):+ ? | () {n,m}

/ 如果要寻找单词的任意序列,他们也许出现在一行上,但也许被分成两行;解决:用到sed的保持空间

#!/bin/bash

# phrase -- 检查跨行的单词

# $1 = 查找的字符串;剩余参数 = 文件名

 

search=$1

shift

for file

do

sed '

/'"$search"'/b

N

h

s/.*\n//

/'"$search"'/b

g

s/ *\n//

/'"$search"'/{

g

b

}

g

D' $file

done

/ sed维护一种模式空间,即一个工作区或临时缓冲区,当应用编辑命令时将在哪里存储单个输入行;sed还维护了称为保持空间(hold space)的另一个临时缓冲区,可以将模式空间的内容复制到保持空间并在以后检索它们;

/ sed地址后面跟有感叹号,那么命令就应用于不匹配该地址的所有行:'/^\.TS/,/^\.TE/!d';

/ sed中的行号计数器不会因为多个输入文件而重置,因此不过指定多少个输入文件,在输入流中也只有一行1

/ sed使用大括号将一个地址嵌套在另一个地址中,或者在相同的地址上应用多个命令:

/^\.TS/,\.TE/{

  /^$/d

}

左大括号必须在行末,而且右大括号本身必须单独占一行,要确保在大括号之后没有空格;

/ 例如:'s/^$/.LP/' 在替换命令的替代部分不必转义字面句点;

/ sed中在s命令的结尾添加全局标志以便取代所有的出现(不只是第一个);

/ sed的s命令中的定界符,不管是哪种定界符,如果他出现在正则表达式中或者替换文本中,那么就用反斜杠来转义他;

/ 在replacement部分。只有下列字符有特殊含义:

& 用正则表达式匹配的内容进行替换;

\n 匹配第n个子串(n是一个数字),这个子串在patten中用“\(”和“\)”指定;

\ 当在替换部分包含&,\和替换命令的定界符时可用\转义它们,另外可用于转义换行符来创建多行replacement字符串;

/ awk的BEGIN模式用于指定在第一个输入行读入之前要执行的动作,如果一个程序只有一个BEGIN模式,并且没有其他的语句,awk将不处理任何输入文件;

/ awk中如果没有指定操作,与模式匹配的输入行将被打印出来(执行打印语句是一个默认操作);

/ awk '{ print $2,$1,$3 }' file   print语句中分割每个参数的逗号使得输出的各值之间有一个空格(也就是输出字段分隔符OFS);

/ 使用-F选型改变字段分隔符,后面跟着(紧跟或者有空白)分隔符;

/ 使用(~)操作符可以测试一个字段的正则表达式:'$5 ~ /MA/ { print $1 "," $6 }';也可使用(!~)来反转这个规则的含义;

/ 根据POSIX参数分析约定,选项“--”标记命令行选型的结束;

 

 

 

显示最后一列:awk '{print $NF}' file

 

posted @ 2014-01-14 17:16  baihuahua  阅读(515)  评论(0编辑  收藏  举报