命令格式:
sed [选项] ‘定址 操作’ 文件        # ’定址 操作’合称’命令’(command)
awk [选项] ‘pattern {action}’ 文件
正则匹配多行简单的多操作格式:
sed [选项] ‘定址 操作; 操作’        # 第2个操作对所有输入行都执行
awk [选项] ‘pattern {action; action}’
嵌套格式:
sed [选项] ‘定址 {定址 操作}’
awk [选项] ‘pattern {if() 执行语句}’    # if()的执行语句如果超过一句就要用{}括起来
1.sed 重点:
正则表达式分隔符, 默认是斜杠/, 若要改变, 如c, 则只要在这个字符前加一个反斜杠\ +正则+c, 例子:
sed -n '\cREcp' filename 等同于sed -n '/RE/p' filename
3.好处: c顶替斜杠成为分隔符, 便于在正则表达式中包含斜杠(无需转义)。
4.定址可以是: 数字(代表行数, $表示最后一行)、正则表达式或2者的结合
5.sed的一层命令里只能有一个定址, 如果嵌套了一层命令, 则又有了一个定址。
6.sed里有模式空间(pattern space)和暂存缓冲区
7.无论sed命令位于bash交互模式还是sed脚本里, 对空格都不用转义(也可以转义), 如: s/ /X/g 等同于s/\ /X/g  都是将空格转为X
8.-n选项的man解释: If auto-print is not disabled, print the pattern space
9.label功能很好很强大, 主要配合N命令进行操作
10.sed里定址和操作都可以用正则
a)行处理时, sed工作原理(不考虑暂存缓冲区与N、n等命令):
b)从标准输入或文件中读入一行, 存入模式空间(pattern space)中, 存的时候不存\n
c)sed依据命令对其进行处理
将处理完的打印出来, 并在末尾加上\n, shell遇到\n就自动换行
a)使用N的时候情况如下:
b)从标准输入或文件中读入一行, 存入模式空间(pattern space)中, 存的时候不存\n
c)sed依据命令对其进行处理, 遇到N命令时, 在模式空间的末尾加上\n, 然后将下一行读入进来, 追加在刚添加的\n后面, 此时模式空间的末尾依然没有\n(至始至终就不会有)
将处理完的打印出来, shell遇到\n时候就自动换行, 并在末尾加上\n
11.详细笔记(未整理)
1. awk 重点:
UNIX.Shell 6.1 第3段的第2行(如果只……)很重要! 
awk '//' names    只给出模式, 而未指定动作
awk '{print $0}' names 只指定动作, 而未定义模式
以上2种输出结果一样 = cat names
2. “模式表达式中暗含着if语句。如果模式表达式含有if的意思, 就不必用花括号把它括起来。当if是显式地给出时, 这个表达式就成了操作语句。”(来源于UNIX.Shell 4th 6.7.1第一段)
3. 操作如果紧跟在某个模式后面(即该操作属于该模式), 它的第一个左花括号就必须与该模式同处一行(包括shell交互模式下、shell脚本模式下与awk脚本中都要这样! )模式永远不会出现在花括号中。
4. 无论是在shell交互模式下还是awk脚本中, 在行末尾用\都表示转义换行符, 即下一行是直接接到这一行中, 而action里, 每个action之间用分号隔开或者换行符隔开
5. UNIX.Shell的6.19.1的第一句话(“next语句从输入文件中取出下一行输入, 然后从awk脚本的顶部重新开始执行”)要注意: 指的是立即跳过当前行(也不执行next分号后的语句), 然后从输入文件中取出下一行, 从awk脚本的顶部重新开始执行。BEGIN{}只会在未读任何行时候被执行, 之后绝对不会再执行, 即使有next。
BEGIN放置的位置不影响执行效果, 如果BEGIN块出现2个, 就会按照脚本文件内容的前后顺序分别执行这2个BEGIN(切记1个BEGIN块至始至终会且只会被执行一次, END块是同样的道理)
6. match函数返回正则表达式在字符串中出现的位置, 如果未出现, 则返回0.match函数把内置变量RSTART设为子串在字符串中的起始位置, RLENGTH则设为子串的长度。这些变量可以被substr函数用来提取相应模式的子串.
7. 经过match()后, 内置变量RSTART和RLENGTH就自动被赋值以匹配词的起始位置和匹配词的长度
8. awk的函数功能像其他语言一样, 可以传递参数, 返回值
9. 如果环境变量LANG=en_US.UTF-8则默认的RHEL5的GNU awk, 关于sub()函数和gsub()函数的正则大小写敏感问题, 核心在于locale。解决方法是LANG=C
10. 详细笔记(未整理)
1.sed与awk的重点比较:
2.“在命令行键入命令时, shell会设法对任何元字符和空格进行转换, sed命令中的任何可能被转换的字符都必
须使用引号括起来。”(来源于UNIX.Shell 4th P105页脚部分)此句同样适用于所有shell下的所有工具, 包括awk。
返回退出状态: sed、awk均只当语法错误时候, 才返回非0, 只要语法正确, 无论是否匹配, 都返回0
3.sed, 如果没有没有定址, sed将处理输入的所有行;但是不能只定址而不操作。
4.awk, 如果没有pattern, awk将处理输入的所有记录;没有action, 将打印匹配的记录。
5.sed的打印命令是p, awk的是print、printf等。
6.sed和awk的命令外都要加单引号’
7.读入文件或从标准输入读入时, 都是一行一行地读入, 然后操作该行, 然后读入下一行, 而不会一段一段地读入
8.大小写转换
sed转换大小写字母方法1:
sed -n '1,3{y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;p}' 将1-3行的小写字母替换成大写字母, 并且打印1-3行。
sed -n '1,3{y/ABCDEFGHIJKLMNOPQRSTUVWX/abcdefghijklmnopqrstuvwxyz/;p}'
将1-3行的大写字母替换成小写字母, 并且打印1-3行。
sed转换大小写字母方法2:
sed 's/.*/\L&/'        将大写字母替换为小写字母
sed 's/.*/\U&/'        将小写字母替换为大写字母
awk实现大小写转换, 可以用toupper(string)、tolower(string)函数来实现, 前者将小写->大写, 后者将大写->小写

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。