Shell Script文本相关-grep,sed,awk

本部分内容主要有:正则表达式入门,用grep在文件中搜索文本,用cut按列切分文件,sed入门,awk入门等内容。

文本处理是shell脚本重要应用领域之一,shell脚本可以将sed、awk、grep、cut等工具组合起来,用于解决文本处理相关的问题。

1.正则表达式

正则表达式的内容之前在Linux学习中有介绍过,详见:http://dulishu.top/linux-regular-expression/

例如,匹配一个IP地址:
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

2.用grep在文件中搜索文本

(1)在文件中搜索一个单词:
$ grep match_pattern filename

(2)也可以从stdin中读取:
$ echo -e “hello\nworld” | grep world
world

(3)–color选项可以在输出行中重点标记出匹配的单词:
$ grep word filename –color=auto

(4)grep命令中要使用正则表达式,需要添加-E选项——意味使用扩展正则表达式,也可以使用默认允许正则表达式的egrep命令:
$ grep -E “[ a-z ]+”
或者
$ egrep “[ a-z ]+”
其中+表示重复一个或一个以上的前一个字符。

(5)为了只输出文件中匹配到的文本部分,可以使用-o选项:
$ echo “this is a line.” | grep -o “line.”
line.    #无-o选项,将输出匹配到的line.所在的整行

(6)-v选项,打印除包含match_pattern的行之外的所有行:
$ grep -v match_pattern file

(7)-c选项,统计文件或文本中包含匹配字符串的行数:
$ grep -c “text” filename
注意,-c只是统计匹配行的数量,并不是匹配的次数,例如:

如果想要统计匹配项的数量,可以:

(8)递归搜索文件——选项-R

如果需要在多级目录中对文本进行递归搜索,有,

其中.表示指定了当前目录;-n表示打印所在行。

(9)忽略大小写
$ echo hello world | grep -i “HELLO”

(10)用grep匹配多个样式——选项-e
$ grep -e “pattern” -e “pattern1”
例如:

(11)grep搜索中包括或排除文件

1)只在目录中递归搜索所有的.c和.cpp文件:
$ grep “main()” . -r –include *.{c,cpp}

2)在搜索中排除所有的README文件:
$ grep “main()” . -r –exclude “README”
如果要排除目录,可以使用–exclude-dir选项。

(12)grep的静默输出——选项-q

例如,测试文件是否包含特定的文本内容:

运行:

(13)打印出匹配文本之前或之后的行——选项-B, -A

通常情况下,grep只会打印出一行。我们可以使用上述选项实现打印匹配行之前或之后n行:

3.用cut按列切分文件

有时,我们不需要按行,而是切分文件。cut可以满足我们的需求,它还可以指定分隔每列的定界符。

命令格式:
$ cut -f FIELD_LIST filename
FIELD_LIST是需要显示的列,由列号组成,彼此之间用逗号分隔。

(1)显示2,3两列:
$ cut -f 2,3 filename

(2)制表符是字段或默认定界符,要指定字段的定界符,使用-d选项:
$ cut -f2 -d “;” delimited_data.txt

4.sed入门

sed是stream editor的缩写,它是文本处理中非常重要的工具。sed命令众所周知的一个用法是进行文本替换。

(1)替换给定文本中的字符串,可以利用正则表达式进行匹配:

上述替换只是将替换结果打印输出,但是原文件中的文本并没有被替换。

(2)选项-i可以将替换结果应用于原文件。很多用户在进行替换之后,借助重定向来保存文件:

前面sed示例只会将每一行中第一处符合要求的内容替换掉。但是如果要替换所有内容,需要在命令尾部加上参数g
$ sed ‘s/pattern/replace_string/g‘ file

(3)有时我们不需要替换前N处,而是替换剩下的匹配:

从第2个开始替换。

(4)移除空白行——’/^$/d’

(5)引用

sed表达式通常用单引号来引用。不过也可以使用双引号,双引号会通过对表达式求值来对其进行扩展,当我们想在sed中使用一些变量字符串时,双引号就有用武之地了:
$ text=hello
$ echo hello world | sed “s/$test/HELLO/”
HELLO world

5.awk入门

awk可以对列和行进行操作,使用起来非常灵活。awk脚本的结构如下所示:

awk ‘BEGIN{ print “start” } pattern { commands } END { print “end” } ‘ file

一个awk脚本通常由3部分组成:BEGIN语句块END语句块能够使用模式匹配的通用语句块。这3个部分都是可选的,脚本通常会被包含在单引号或双引号中。

(1)例如,打印出file.txt中的行数
$ awk ‘BEGIN { i=0 } { i++ } END { print i }’ file.txt

(2)awk命令的工作方式:
1)执行BEGIN { commands }语句块中的语句;
2)从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。
3)当读至输入流末尾时,执行END { commands } 语句块。

最重要的部分是pattern语句块中的通用命令。这个语句块同样是可选的,如果不提供该语句块,则默认执行{ print },即打印每一个读取到的行。awk对读取到的每一行,都会执行这个语句块。

(3)有如下示例

 

《Shell Script文本相关-grep,sed,awk》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注