sed 主要是对行的处理,awk 主要是对列的处理

 

sed 查找和编辑文本,是一个字符流编辑器,可以很好地完成对多个文件的一系列编辑工作
 必须通过行号或正则表达式指定要改变的文本行
执行方式
  1、命令行键入命令  
  2、将sed命令插入脚本文件,然后调用sed
  3、将sed命令插入脚本文件,并使sed脚本可执行
选项
 n 不打印
 p 打印编辑行
 c 下一个命令是编辑命令
 f 在脚本文件中有sed命令时使用

保存改动的内容到文件,使用重定向

使用sed在文件中定位文本的方式
 x x为一行号,如1
 x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
 / p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
 / p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
 p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
 x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u /
 x , y ! 查询不包含指定行号x和y的行。1 , 2 !

基本sed编辑命令
 p 打印匹配行
 = 显示文件行号
 a\ 在定位行号后附加新文本信息,附加
 i\ 在定位行号后插入新文本信息,插入
 d 删除定位行,删除
 c\ 用新文本替换定位文本,替换
 s 使用替换模式替换相应模式
 r 从另一个文件中读文本
 w 写文本到一个文件
 q 第一个模式匹配完成后推出或立即推出
 l 显示与八进制A S C I I代码等价的控制字符
 { } 在定位行执行的命令组
 n 从另一个文件中读文本下一行,并附加在下一行
 g 全局替换
 y 传送字符
 n 延续到下一输入行;允许跨行的模式匹配语句

sed识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特
殊字符,必须使用( \)屏蔽其特殊含义

编程举例
sed -n '2p' quote.txt #只打印第二行  -n 显示打印定位行
sed -n '1,3p' quote.txt #打印1-3行
sed -n '/Neave/'p quote.txt  #打印匹配单词Neave的行
sed -n '1,/The/'p quote.txt #原意,在第一行查询模式The ,实际未得到预期结果
  使用模式和行号进行查询 未成功
sed -n '/\$/'p quote.txt    #查询包含$的行,特殊字符前需要使用转义字符'\' 屏蔽其特殊含义 
sed -n '3,$p' quote.txt  #打印3到最后一行,$为最后一行的意思  
sed -n '/.*ing/'p quote.txt #查询以ing结尾的任一单词所在行,.* 任意多个任意字符  
sed -n '$p' quote.txt  #打印最后一行
sed -e '/music/=' quote.txt #打印所有内容,并在匹配行前一行打印行号。
sed -n '/music/=' quote.txt #只打印匹配行号。= 显示出行号
sed -n -e '/music/p' -e '/music/=' quote.txt #打印匹配行和行号

#!/bin/sed -f    #sed命令解释行,在/bin中查找sed以运行命令
/company/ a\   #匹配company ,a\ 附加并换行,即插入新行,以下为新行字符
The suddenly it happened.
  但是sed的操作不是在初始文件上的,所以,对于它的添加或修改都不会影响原始文件,
  若要想把改过的文件保存,需重定向到一个文件。
  
#!/bin/sed -f
4 i\   #在第四行上一行插入
The suddenly it happened. 

sed '1,$d' quote.txt #删除1到最后一行,原始文件不变,只是显示在屏幕上的字符没有这些行而已
sed '/company/d' quote.txt #匹配删除

sed 's/night/NIGHT/' quote.txt #用NIGHT替换第一个匹配的night
sed 's/night/NIGHT/g' quote.txt #用NIGHT替换全部匹配的night
sed 's/\$//' quote.txt #将字符$删除,因为没有用任何字符来替换

sed -n 's/nurse/"Hello" &/p' quote.txt  #修改模式后带 &,将其放在匹配模式之前
sed 's/[0-9][0-9]*/& Passed/g' une.txt  #修改模式前带&,将其放在匹配模式之后
 可以理解为& 是为匹配模式占位
 
sed 's/The/Hi!/w sed.out' quote.txt  #用Hi!替换The显示替换后的所有文本,
 并将修改了的行写入sed.out中,文件名在单引号中,w写
sed '1,2 w send.out' quote.txt #将1,2行内容写入send.out
sed '/good/ w send.out' quote.txt #将匹配行内容写入send.out  
sed '/company/r file' quote.txt #将将文件file中的内容插入在匹配行后
sed '/.a.*/q' quote.txt #查询模式首次出现行,并退出
sed -i '/world/s/jint/jjjjjjj/g' test.sh

sed 为从另一个系统中下载的文件剔除控制字符。
 产生控制字符(^M)的方法,先按ctrl+v ,然后按Enter

cat dos.txt | sed 's/^0*//g' | sed 's/^M//g'| sed 's/##/  /g'
 #将dos.txt文件,删除行首的任意个0,删除控制字符,并用空格替换##
 
cat a.txt | sed 's/--*//g' \  # '\' 是命令未完,还有下一行
> | sed '/^$/d' | sed '$d' | sed '1d'|awk '{print $1}'
 #将a.txt文件,删除--*表示的横线,删除空行^行首、$行尾,删除最后一行,
 #删除第一行,打印第一列

echo $NAME | sed "s/go/$REPLACE/g" 要从shell将变量REPLACE的值传入sed,需要使用双引号“”
NEW_NAME=`echo $NAME | sed "s/go/$REPLACE/g"`
  #从sed输出中设置shell变量,相当于执行完sed命令,使用执行符 ``

awk
 保存awk 输出, 输出重定向符号 > 文件名
 ~ 模糊匹配
 == 精确
 awk '{print $0}' grade.txt >wow #在屏幕上输出grade.txt的全部列,并将其写入wow文件中
 awk '{print $0}' grade.txt | tee wow #同上
 awk 'BEGIN{print"Name\n---------"}{print $1}END{print "end-of reports"}' une.txt
  #在屏幕上加入报告头,和信息尾

 awk '{if($4~/good/)print $1}' grade.txt  #将第四列与good匹配,打印匹配行的第一列
 awk '$0 ~ /good/'
 awk '$3=="48" {print $0}' grade.txt #精确匹配,只能是48
 awk '{if($3~/48/) print $0}' grade.txt #模糊匹配,第三列有48即可
 awk 'END {print NR}' grade.txt #查看整个记录的总行数
 awk '{print NF,NR,$0}END{print FILENAME}' grade.txt
  #NF记录的总列数,NR 行数,$0 全部列,并在结尾处添上 文件名
  
 pwd | awk -F/ '{print $NF}'  #将命令pwd的结果处理,—F/ 以 '/' 为列划分方式,NF 打印最后一列
 awk 'BEGIN{BASELINE="27"}{if($6<BASELINE)print$0}' grade.txt
  #在开始给变量赋值,“27” 和27 一样,然后用变量比较,和直接比较一样
 awk '{if($1~"A")$6-2;print$1,$6,$7}' grade.txt
  #如果第一列的值匹配A 就将该行的第6列数值减2,打印出第1,6,7行
 awk '{if($1=="A"){$6=$6-2};print$1,$6,$7}' grade.txt
 awk '{if($1=="A"){$1="AAA"};print$1,$6,$7}' grade.txt
  #如果第一列的值等于A 就将该行的第1列的值改为AAA,打印出第1,6,7行
  
 awk '(tot+=$6);END{print "Club student total points:"tot}' grade.txt  
  #打印所有成绩,同时将第6列的总和打印在结尾
  
 awk '{(tot+=$6)};END{print "Club student total points:"tot}' grade.txt
 #加一对花括号{}。将只显示总成绩,即尾句
 
 gsub(/a/,b)  在整个文件中,用b来替换a,替换字符串
 awk 'gsub(/a/,b) {print $0}' grade.txt
 
 awk '$1=="A" {print length($1)" "$1}' grade.txt
   打印grade.txt中 第一列为A 的行的 第一列的长度 和 第一列
 
 awk 'BEGIN {print match("ANCD",/A/)}'    ANCD中是否包含A ,结果是——1,否——0
  match("",//) 用来测试目标字符串中是否包含查找字符的一部分
  
 awk 'BEGIN {print index("ANCD","D")}'
  index("A","B") 用来查询B在A中第一次出现的位置
  
 awk 'BEGIN {print split("123#456#678",myarray,"#")}'
  split("字符串",数组名,"分隔符"); 返回字符串数组元素个数
 
 awk '$1~"A" {print substr($1,2,5)}' grade.txt 打印字符串的第二个字符起长度为5 的字符串
 substr("字符串",2,5)
 
 awk 'BEGIN{str="a few goon new"}END{print substr(str,7)}' grade.txt
 返回字符串指定位置后面字符。  需要在后面接一个文件名,但文件的内容并没有显示

 
 awk -F: '$1 ~ nihao{print $0}' test.sh

 awk -F: '/npp/{print $(NF-1)}' /etc/passwd

 echo "65" |awk '{printf "%c\n",$0}'
 awk 'BEGIN {printf "%c\n",65}' 

 awk ' {printf "%-15s %s \n",$1,$3}' grade.txt  格式化输出方式
 awk '{if($5<AGE) print $0}' AGE=10 grade.txt  打印第5列的值比变量AGE小的行
 
 #!/bin/awk -f
 # name: arraytest
 BEGIN{
 record="123#456#789";
 split(record,myarray,"#")}
 END{for(i in myarray){print myarray[i]}}
 
 ./arraytest.awk /dev/null   打印数组信息