awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
一、grep命令
在Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
1.1 基本语法
grep [option] pattern file
# 管道命令一起
命令 | grep xxxx
常用的参数
常用选项 | 释义 |
---|---|
-i | 忽略大小写进行匹配。 |
-v | 反向查找,只打印不匹配的行。 |
-n | 显示匹配行的行号。 |
-r | 递归查找子目录中的文件。 |
-l | 只打印匹配的文件名。 |
-c | 只打印匹配的行数。 |
-w | 只匹配整个单词,而不是部分匹配。 |
-o | 只显示匹配的部分,而不是整行。 |
-A n | 显示匹配行及后面n行的内容。 |
-B n | 显示匹配行及前面n行的内容。 |
-C n | 显示匹配行及前后各n行的内容。 |
-e pattern | 指定多个匹配模式。 |
-E | 使用扩展正则表达式进行匹配。 |
-F | 将模式视为固定字符串而不是正则表达式。 |
1.2 使用举例
准备文件test
忽略大小写查询
找到w的后两行
找到2的前两行
输出匹配到的行数
实现多个匹配之间的或关系,查找包含w或者p的
二、sed命令
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作
2.1 基本语法
sed [-nefri] ‘command’ 输入文本
选项说明
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e∶直接在指令列模式上进行 sed 的动作编辑; -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作; -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i∶直接修改读取的档案内容,而不是由屏幕输出。
动作说明
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d ∶删除,因为是删除啊,所以 d 后面通常不接任何内容; i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~ s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
2.2 使用举例
定义文件test,内容如下
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
2.2.1 增加内容
**增加一行**
# 在test文件的第一行后面追加上 aaaaaaaa
sed '1a aaaaaaaa' test
注意:只是将文字处理了,没有写入到文件里,文件里还是之前的内容。
发现文件的内容并没有发生任何的变化
**增加多行**
在一行到第三行的后面追加上bbbbbbbb
2.2.2 插入内容
在最后一行插入byebye
直接写入文件的化可以选择使用i的参数
3.2.3 删除内容
删除的字符是d,用法跟前面也很相似,对匹配到的数据行,进行删除。
sed '1d' test #删除第一行
sed '$d' test #删除最后一行
sed '1,2d' test #删除第一行到第二行
sed '2,$d' test #删除第二行到最后一行
sed '/Linux/d' test
删除最后一行
2.2.4 替换内容
整行替换
c 针对匹配到的整行内容替换为指定字符串
将含有linux的那一行替换为xuecheng
语法:sed '/原来的字符/c 新字符' 文件的名字
sed '/linux/c xuecheng' test
将存在Linux的一行全部替换
只替换存在liunx的字段
2.2.5 日志截取
首先在我们的这个路径下随便找一个日志文件,我们根据时间段来截取部分日志信息
sed -n '/时间段/,/时间段/p' logfile
三、awk命令
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符linux中有三剑客之称:三剑客之首就是 AWK三剑客功能:
grep : 过滤文本
sed : 修改文本
awk : 处理文本
awk只要是用来格式化文本
3.1 基本语法
awk [参数] [处理内容] [操作对象]
参数说明
参数 | 说明 |
---|---|
-F separator | 指定字段分隔符。 |
-f file | 从指定的文件中读取程序 |
-v var=value | 定义awk程序中的一个变量及其默认值 |
-mf N | 指定要处理的数据文件中的最大字段数 |
-mr N | 指定数据文件中的最大数据行数 |
-W keyword | 指定awk的兼容模式或警告等级 |
3.2 使用举例
3.2.1 从命令行读取程序脚本
awk 动作 文件名
准备一个文件test
**'{}'打印**
打印第二列的内容
打印第一列和第四列的内容
查找以This开头的行
查找以awk为结束的行
匹配的就是严格以This开头的内容。
使用数据字段变量
awk会将如下变量分配给它在文本行中发现的数据字段(列):
-
$0代表整个文本行;
-
$1代表文本行中的第1个数据字段;
-
$2代表文本行中的第2个数据字段;
-
$n代表文本行中的第n个数据字段。
-
!: 逻辑非
-
~ : 进行正则匹配(类似于关系表达式)
查找不包含is关键字的内容
包含is的
3.2.2 变量
wk中有不少内置的变量,比如$NF代表的是分割后的字段数量,相当于取最后一个。
NF: number filed 当前行分割后的字段个数。打印的时候,是取出最后一列
NR: number row 表示当前第几行、
列出最后一列
输出当前行有几列,以及当前是第几行
其他的内置变量还有:
变量名 | 说明 |
---|---|
FILENAME:当前文件名 | |
FS | 字段分隔符,默认是空格和制表符。 |
RS | 行分隔符,用于分割每一行,默认是换行符。 |
OFS | 输出字段的分隔符,用于打印时分隔字段,默认为空格。 |
ORS | 输出记录的分隔符,用于打印时分隔记录,默认为换行符。 |
OFMT | 数字输出的格式,默认为%.6g。 |
3.2.3 函数
awk还提供了一些内置函数,方便对原始数据的处理。主要如下:
toupper():字符转为大写。
tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
将所有的,转为大写输出
3.2.3 条件
awk允许指定输出条件,只输出符合条件的行。输出条件要写在动作的前面:
awk '条件 动作' 文件名
还是刚才的例子,用逗号分隔之后有好几个空白行,我们加上限制条件,匹配后为空的不显示:
[root@localhost ~]# awk -F, '$2!="" {print $2}' test
apple
3.2.3.1 if 语句
awk提供了if结构,用于编写复杂的条件。比如:
[root@localhost ~]# awk '{if ($2 > "t") print $1}' test
2
将第一列内容大于2的行输出:
[root@localhost ~]# awk '{if($1>'2') print $0}' test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
这一句的完整含义应该是:把每一行按照空格分割之后,如果第二个单词大于t,就输出第一个单词。这里对字符的大小判断应该是基于字符长度和 unicode 编码。