我们知道,Linux命令有强大的批处理功能,就是shell啦,这里主要谈文本处理中的sed与awk命令。
为了照顾Linux初学者,在这里,先讲下这两个命令的基础使用。
1.sed
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,在取列上有优势。
sed有很多参数,下面仅列举常用的,其它的可以通过man sed查看。
a 在当前行下面插入文本。
i 在当前行上面插入文本。
c 把选定的行改为新的文本。
d 删除,删除选择的行。
s 替换指定字符。
= 打印当前行号码。
g 表示行内全面替换。
p 表示打印行。
如:sed -i 's/book/books/g' a.txt
将a.txt中的book全部替换为books。
sed '/^$/d' file
删除a.txt中空白行。
sed '2d' a.txt
删除a.txt中的第二行内容。
sed -i '4,8d' a.txt
删除 a.txt 中第4行到第8行。
现在来看,如何通过sed来处理大于5G的文本文件。
下图为常规处理文本文件的方法,即通过IO流,采用管道处理文件,当文件小时,对性能影响不大,当文件大于1G时,其时间复杂度会很高。
因此,采用sed可轻松解决此问题。
如:上文将a.txt中的book全部替换为books
2.awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
awk命令格式和选项:
语法形式
awk [options] 'script' var=value file(s)
常用命令选项:
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
awk脚本基本结构:
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,awk取列是优势。
我们直接来看例子。
如:选取ps命令中的第二列,如图所示。
可以看到,如果我们想批量kill进程时,用awk很方便吧。
此外,awk还可以定义多维数组,逻辑运算等。
如:输出3*3列的二维数组,并计算两两元素的乘积。
通过sed与awk配置使用,在大量文本处理时,可产生事半功倍的效果,看,Linux多强大。