文本处理工具sed
sed处理文本时是以行为单位的,每处理完一行就立即打印出来,然后再处理下一行,直至全文处理结束。sed可做的编辑动作包括删除、查找替换、添加、插入、从其他文件中读入数据等。
sed命令使用的场景包括以下:
常规编辑器编辑困难的文本。
太过于庞大的文本,使用常规编辑器难以胜任(比如vi一个几百兆的文件)
有规律的修改文本,加快文本的处理速度
sed修改文件流的方式如下:sed [options] ‘command’ file
# ‘command’命令均为vi编辑器中的命令
# sed命令默认不修改原文件,如果希望保存修改后的文件则需要用重定向’>’
#使用-e参数和分号连接多编辑命令
例如:sed –e ‘s/this/That/g’ –e ‘s/line/LINE/g’ sed.txt或者sed ‘s/this/That/g’ ; ‘s/line/LINE/g’ sed.txt
删除
sed ‘1d’ sed.txt >save.txt #删除第一行
sed ‘1,3d’ sed.txt #删除1到3行
sed ‘1,$d’ sed.txt #删除1到最后一行
sed ‘$d’ sed.txt #删除最后一行
sed ‘5!d’ sed.txt #只保留第五行
sed ‘/Empty/d’ sed.txt #删除所有包含Empty的行
sed ‘/^$/d’ sed.txt #删除空行
查找替换
使用s命令可将查找到的匹配文本内容替换为新的文本。
sed ‘s/line/LINE/’ sed.txt #将line替换为LINE,每行默认替换一个
sed ‘s/line/LINE/2’ sed.txt #将line替换为LINE,每行默认替换两个
sed ‘s/line/LINE/g’ sed.txt #将line替换为LINE,全部替换
sed ‘s/^this/That/’ sed.txt #只替换开头的this为That
#命令中间不能有空格
字符转换
使用y命令可进行字符转换,其作用为将一系列字符逐个的变换为另外一系列字符,基本用法如下:
sed ‘y/OLD/NEW/’ file #将全文中字母O替换为N,字母L替换为E,字母D替换为W.
插入文本
使用i或者a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入.
sed ‘2 i Insert’ sed.txt #在第二行之前插入文本
sed ‘2 a Insert’ sed.txt #在第二行之后插入文本
sed ‘/Second/ i \Insert’ #在匹配行之前插入文本
读入文本
使用命令r可以从其他文件中读取文本,并插入匹配行之后.
sed ‘/^$/r /etc/passwd’ sed.txt #将/etc/passwd中的内容读取到sed.txt空行之后
打印
使用p命令可进行打印,这里使用sed命令时一定要加参数-n,表示不打印没关系的行。
例:sed –n ‘1p’ sed.txt #只打印第一行
#sed实际处理了第二行,其他几行由于没有匹配所以并未真正处理。
再如:sed –n ‘s/the/THE/gp’ sed.txt #只打印实际处理过的行,简化了输出,第二行the全部转换为THE
写文件
sed本身默认并不改写原文件,而只是对缓冲区的文本做了修改并输出到屏幕。所以想保存文件,除了使用重定向或-i,还可以使用w命令将结果保存到外部指定文件。
例如:sed –n ‘1,2 w output’ sed.txt #这里没有任何的输出,因为输出被重定向到文件output
#将sed.txt文件中1,2行写入文件output中
sed脚本
将动作静态化的写到某个文件中,然后调用sed命令并使用-f参数指定该文件。
vi sed.rules
s/this/THAT/g
/^$/d
sed sed.rules sed.txt
高级替换
替换匹配行的下一行,使用n命令
例如:sed ‘/^${n;s/line/LINE/g}’ sed.txt
文本处理工具awk
awk是基于列的处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,“空白字符”包括空格、tab、连续的空格和tab等。每个非空白的部分叫做域,从左到右依次是第一个域,第二个域。$1,$2表示第一域第二个域,$0表示全部域。
打印指定的域
#打印第一个和第四个列awk ‘{print $1,$4}’ awk.txt
#打印全部内容awk ‘{print $0}’ awk.txt
指定打印的分隔符
默认情况下awk是使用空白字符作为分隔符的,但是也可以通过-F参数指定分隔符来区分不同的域(类似于cut命令).
注意:必须得使用单引号不能使用双引号.
例如:awk –F’.’ ‘{print $1,$2}’ awk.txt
打印每行的列数内部变量NF参数
awk ‘{print NF}’ awk.txt#打印每行的列数,指定不同的分隔符会有不同结果
打印固定域
在NF前加上$符号,则代表最后一列,这样不管有多少列,只要使用$NF就能打印出最后一行。倒数第二行为$(NF-1)
例如:awk ‘{print $NF}’ awk.txtawk ‘{print $(NF-1)}’ awk.txt
截取字符串
使用substr函数对指定域截取字符串
substr(指定域,第一个开始字符的位置,第二个结束的位置)
#其中第二个结束的位置可以为空,这样默认输出到该域的最后一个字符
例如:cat awk.txt | awk ‘{print substr($1,6,2)}’#输出第一个域从第六个字符开始长度为2的字段
内部变量length
使用内部变量length可以确定字符串的长度
例如:cat awk.txt | awk ‘{print length}’
使用awk求列和
例如: cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}’END{print total}’ #求年龄的和
cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}’ #求年龄的平均值
NR为内部变量,表示已经读取的记录数
网友评论