前言我们常会对文件内容进行的处理不外乎,查找和修改两种,在Unix中常用来实现这个功能的命令是 grep ,sed, awk它们最常被用到的功能介绍: grep 在文件中查找某个字符串,输出包含该字符串的行 sed 对文件中满足某条件的数据一行一行的进行处理,比如:打印第几行数据,替换字符串 awk 对文件的一列一列的进行处理,比如,以空格分割打印第几列数据这里主要介绍:sed命令sed 查找和编辑文本,是一个字符流编辑器,可以很好地完成对多个文件的一系列编辑工作必须通过行号或正则表达式指定要改变的文本行执行方式1、命令行键入命令 2、将sed命令插入脚本文件,然后调用sed3、将sed命令插入脚本文件,并使sed脚本可执行选项-n 不打印p 打印编辑行-c 下一个命令是编辑命令 -e 多个匹配-w 写文本到一个文件 -i 添加保存改动的内容到文件,使用重定向使用sed在文件中定位文本的方式x x为一行号,如1x,y 表示行号范围从x到y,如2,5表示从第2行到第5行/pattern/ 查询包含模式的行。例如/disk/或/[a-z]//pattern/pattern/ 查询包含两个模式的行。例如/disk/disks//pattern/,x 在给定行号上查询包含模式的行。如/disk/,3x,/pattern/ 通过行号和模式查询匹配行。3,/disk/x,y ! 查询不包含指定行号x和y的行。1,2 !基本sed编辑命令f 在脚本文件中有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 #打印匹配行和行号
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 -i '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命令,使用执行符 ``