使用sed和awk进行文本处理
Posted ChavinKing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sed和awk进行文本处理相关的知识,希望对你有一定的参考价值。
Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义。针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助。此篇文档作用就是在自己忘记个别参数的情况下有个一目了然的答案。
一、sed进行文本处理
Linux的sed工具是linux的流编辑器,用于处理文本文件,配合正则表达式使用,功能非常强大。以下是一些sed使用示例和解释:
# sed \'s/oracle/CHAVIN/\' textfile |
替换文本文件textfile中oracle为CHAVIN。脚本中的s表示替换字符的意思。 |
# sed -i \'s/oracle/CHAVIN/\' textfile |
-i参数意味着替换结果直接覆盖了源文件。 |
# sed \'s/mysql/MYSQL/g\' textfile # sed \'s/mysql/MYSQL/2g\' textfile # sed \'s/mysql/MYSQL/3g\' textfile |
默认情况sed会将每一行中第一处符合条件的字符替换掉,g代表替换当前行中匹配的所有的字符。如果想替换第n处,可以指定ng。 |
# sed \'s:root:CHAVIN:\' passwd # sed \'s|root|CHAVIN|\' passwd |
其中:、|和/一样都被用作界定符,效果相同。 |
# sed \'/^$/d\' textfile # sed \'/mysql/d\' textfile |
符号^$/d可以移除textfile中的空白行。 /mysql/d可以移除匹配包含字符mysql的行。 |
# sed \'s/\\b[0-9]\\{3\\}\\b/NUMBERS/g\' textrep |
匹配正则 \\b[0-9]\\{3\\}\\b 的选项被替换。 |
# echo this is an example | sed \'s/\\w\\+/[&]/g\' |
其中&号代表匹配的字符串内容。正则\\w\\+匹配单词。 |
# echo this is eigit 7 in a number | sed \'s/eigit \\([0-9]\\)/\\1/\' |
替换\\([0-9]\\)匹配的字符串,第一个匹配的使用\\1表示,第二个使用\\2表示,依次类推。 |
# echo hello world | sed "s/$name/HELLO/" |
Sed可以使用双引号引用,使用双引号可以使用变量($name)的形式,单引号引用的不可以。 |
二、awk进行高级文本处理
使用awk的优势在于,它可以同时对行和列进行处理。awk脚本结构如下:
awk ‘BEGIN{ print “start” } patten { commonds } END{ print “end” }’ file
如上,awk脚本由3部分组成,BEGIN、END、带匹配选项的语句块可以随意省略。
Awk自带的一些重要功能:
l NR:记录数量,当前行号
l NF:当前行字段总数
l $0:当前行内容
l $1:当前行第一个字段内容
l $n:当前行第n个字段内容
l $NF:当前行最后一个字段内容
以下为常用用法示例及解释:
# echo -e "line1 f2 f3\\nline2 f4 f5\\nline3 f6 f7" | awk \'{print "Line no:"NR",No of fields:"NF",$0="$0",$1="$1",$2="$2",$3="$3,"$NF="$NF}\' |
测试NR、NF、$0、$1、$n、$NF |
# awk \'{ print $3,$2 }\' textfile |
打印第2行、第3行数据 |
# seq 5 | awk \'{sum=sum+$1}END{print sum}\' |
计算累加 |
# seq 5 | awk \'BEGIN{print "===================="} !/3/ { print $0 } END{print "===================="}\' |
打印不包含3的行内容。 |
!/3/属于awk中字段过滤部分,常用的过滤方式如下: NR<5:行号小于5的行 NR==1,NR==5:行号在1~5之间 /linux/:包含linux的行 !/linux/:比包含linux的行 |
# var=1000 # echo | awk -v VARIABLE=$var \'{ print VARIABLE }\' |
使用参数“-v”将外部变量传递给awk |
# var1=1000 # var2=2000 # echo | awk \'{print v1,v2}\' v1=$var1 v2=$var2 |
将变量赋值放在awk语句块后边声明,可以同时传递多个值到awk中 |
# awk -F: \'{ print $1,$2,$3,$4,$NF }\' passwd |
使用参数“-F”设定字段分隔符,默认字段分隔符是空格,这里指定为“:”。 |
# echo | awk \'{ for(i=1;i<10;i++){ print i } }\' |
在awk中使用for循环。 |
# echo | awk -F: \'{ "grep root /etc/passwd" | getline output;print output }\' |
使用输出结果读入变量方式为output赋值,语法为【“command” | getline output】。 |
Awk内嵌函数参考文档:http://www.cnblogs.com/chengmo/archive/2010/10/08/1845913.html
以上是关于使用sed和awk进行文本处理的主要内容,如果未能解决你的问题,请参考以下文章