3.1 查找文本
 
 
 
 
 
 grep:使用POSIX定义的基本正则表达式(BRE)。 

 
 
 egrep:使用扩展正则表达式(ERE)。 

 
 
 fgrep:快速grep。使用优化的算法,匹配固定字符串而非正则表达式。 

 
 
 
 
 
 1992 POSIX标准将这三个改版整合成一个grep程序。 

 
 
 
 
 
 $ who | grep -F austen 

 
 
 使用-F选项查找固定字符串。事实上,只要匹配的模式里未含有正则表达式的meta字符, 

 
 
 则grep默认行为模式就等同于使用了-F。 

 
 
 
 
 
 
 
 
 3.2.6 在文本文件里进行替换 

 
 
 
 
 
 一般来说,执行文本替换的正确程序应该是sed - 流编辑器。 

 
 
 sed 's/:.*//' /etc/passwd | 删除第一个冒号之后的所有东西 

 
 
  sort -u 排序列表并删除重复部分 

 
 
 
 
 
 任何可显示的字符都能作为定界符。 

 
 
 sed 's;/home/tolstoy/;/home/lt/;' 

 
 
 sed 's/\\/\\/g' 

 
 
 
 
 
 用-e和-f选项,不用将多个sed通过管道串起来,就可以一次替换多个。 

 
 
 $ sed -e 's/foo/bar/g' -e 's/chicken/cow/g' file1.xml > file2.xml 

 
 
 或 

 
 
 $ cat fixup.sed 

 
 
 s/foo/bar/g 

 
 
 s/chicken/cow/g 

 
 
 ... 

 
 
 $ sed -f fixup.sed file1.xml > file2.xml 

 
 
 
 
 
 
 
 
 3.2.8 sed的运作 

 
 
 
 
 
 命令行上的每个文件名会依次打开与读取。如果没有文件,则使用标准输入。 

 
 
 sed读取每个文件,一次读一行,将读取的行放到内存的一个区域(模式空间)。 

 
 
 所有编辑上的操作都会应用到模式空间的内容,当所有操作完成后,sed会将模式 

 
 
 空间的最后内容打印到标准输出,再回到开始处,读取另一个输入行。 

 
 
 
 
 
  

 
 
 
 
 
 
 
 
 3.3 字段处理 

 
 
 
 
 
 用空格(制表符)或特定的定界符(如冒号)。 

 
 
 #字符起始的行表示注释,软件必须可忽略这样的行才行。 

 
 
 
 
 
 以定界符分隔字段的最好例子就是/etc/passwd了:一行表示一个用户,每个字段以冒号隔开。 

 
 
 该文件含有7个字段: 

 
 
 tolstoy:x:2076:10:Leo Tolstoy:/home/tolstoy:/bin/bash 

 
 
 1.用户名称:2.加密后密码:3.用户ID:4.用户组ID:5.姓名:6.根目录:7.登录的Shell。 

 
 
 
 
 
 
 
 
 3.3.2 使用cut选定字段 

 
 
 
 
 
 $ cut -d : -f 1,5 /etc/passwd 

 
 
 root:root 

 
 
 ... 

 
 
 tolstoy:Leo Tolstoy 

 
 
 
 
 
 $ cut -d : -f 6 /etc/passwd 

 
 
 /root 

 
 
 ... 

 
 
 /home/tolstoy 

 
 
 
 
 
 
 
 
 3.3.3 使用join连接字段 

 
 
 
 
 
 以一个共同的键值(主字段)将多个文件结合在一起。 

 
 
 
 
 
 $ cat sales 

 
 
 #业务员 数据量 

 
 
 joe 100 

 
 
 jane 200 

 
 
 herman 150 

 
 
 chris 300 

 
 
 
 
 
 $ cat quotas 

 
 
 #业务员 配额 

 
 
 joe 50 

 
 
 jane 75 

 
 
 herman 80 

 
 
 chris 95 

 
 
 
 
 
 #! /bin/sh 

 
 
 #  

 
 
 
 
 
 # 删除注释并排序数据文件 

 
 
 sed '/^#/d' quotas | sort > quotas.sorted 

 
 
 sed '/^#/d' sales | sort > sales.sorted 

 
 
 
 
 
 # 以第一个键值作结合 

 
 
 join quotas.sorted sales.sorted 

 
 
 
 
 
 # 删除缓存文件 

 
 
 rm quotas.sorted sales.sorted 

 
 
 
 
 
 
 
 
 3.3.4 使用awk重新编排字段 

 
 
 
 
 
 awk程序基本架构:pattern { action } 

 
 
 pattern通常是由斜杠括起来的ERE,action通常是一个明了的print语句。 

 
 
 省略pattern则会对每一条输入记录执行action,省略action则等同于{ print }。 

 
 
 
 
 
 awk自动将各个记录分为字段,并将每条记录内字段数目存储到内建变量NF。 

 
 
 默认以空白分隔,还可以将FS变量设置为一个不同的值。$加数字表示字段值。 

 
 
 
 
 
 awk '{ print $1 }' 打印第1个字段 

 
 
 awk '{ print $2, $5 }' 打印第2与第5个字段 

 
 
 awk '{ print $1, $NF }' 打印第一个与最后一个字段 

 
 
 awk 'NF > 0 { print $0 }' 打印非空行 

 
 
 awk 'NF > 0' 同上 

 
 
 
 
 
 awk -F : '{ print $1, $5 }' /etc/passwd 设置字段分隔字符,-F选项自动设置FS变量。 

 
 
 root root 

 
 
 ... 

 
 
 tolstoy Leo Tolstoy 

 
 
 
 
 
 记得在print的参数间用逗号隔开,否则awk将连接相邻的所有值。 

 
 
 awk -F: '{ print "User" $1 "is really" $5 }' /etc/passwd 

 
 
 Userrootis reallyroot 

 
 
 ... 

 
 
 Usertolstoyis reallyLeo Tolstoy