前言
在Linux的学习和使用当中,人们常常提到的三剑客其实指的是grep、sed、awk这三个命令的简称,当熟练掌握了这几个命令,可以极大的提升运维效率。在讲到这三个命令之前,我们得先了解什么是正则表达式,正则表达式是学习三剑客的基础和前提。
一、正则表达式
正则表达式:Regular Expression,描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出复核某个条件的子串等。
标准正则表达式:
元字符:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
字符集合:
[:alnum:] 代表英文大小写字符及数字,亦即 0~9、A~Z、a~z
[:alpha:] 代表任何英文大小写字符,亦即 A~Z、a~z
[:blank:] 代表空格键与[tab]按键两者
[:cntrl:] 代表键盘上面的控制按键,包括CR、LF、Tab、Del等
[:digit:] 代表数字而已,即 0~9
[:graph:] 除了空格符(空格键与[tab]按键)外的其他所有按键
[:lower:] 代表小写字符,即 a~z
[:print:] 代表任何可以被打印出来的字符
[:punct:] 代表标点符号(punctuation symbol),亦即 : " ' ? ! ; : # $
[:upper:] 代表大写字符,即 A~Z
[:space:] 代表会产生空白的字符,包括空格键、[tab]、CR等
[:xdigit:] 代表十六进制的数字类型,因此包括 0~9、A~F、a~f 的数字与字符
匹配次数(贪婪模式):
* 匹配其前面的字符任意次
? 匹配其前面的字符0次或者1次
+ 匹配其前面的字符至少1次
.* 任意长度的任意字符
位置锚定:
^ 锚定行首,此字符后面的任意内容必须出现在行首
$ 锚定行尾,此字符后面的任意内容必须出现在行尾
^$ 空白行
因为在Linux系统中shell解释器的特殊处理,某些元字符在linux下具有展开式等特殊含义,在实际使用过程中,我们需要添加 / 对其进行转义。
\? :匹配其前面的字符1次或0次;
\+ : 匹配至少1次;
\{m,n\} :匹配其前面的字符至少m次,至多n次;
\{1,\} :匹配前面的字符至少1次;
\{0,3\} :匹配前面的字符0次至3次均可;
备注:至少0次,必须要显示的写出来
\< 或者 \b :锚定词首,其后面的任意字符必须作为单词首部出现
\> 或者 \b :锚定词尾,其后面的任意字符必须作为单词的尾部出现
扩展正则表达式:
字符匹配:
. 匹配单个字符
[abc] 包含abc任意一个字符
[^abc] 不包含abc任意一个字符
次数匹配(不用再转义):
* 匹配前一个字符任意次
? 匹配其前面的字符1次或者0次
+ 匹配其前面的字符至少1次
{m,n} 匹配其前面的字符至少m次,至多n次
位置锚定:
\< 词首
\> 词尾
二、grep命令--擅长查找
grep命令家族有 grep、egrep、fgrep 三个子命令,适用于不通的场景,具体如下:
1.grep 原生的grep命令,使用“标准正则表达式”作为匹配标准
2.egrep 扩展的grep命令,相当于 $(grep -E) ,使用“扩展正则表达式”作为匹配标准
3.fgrep 简化版的grep命令,不支持正则表达式,但搜索速度快,系统资源使用率低
基本语法:
grep [options] PATTERN [FILE...]
options部分
-i :忽略大小写
--color=auto : 高亮匹配上的字符串
-n : 显示匹配的行号
-c : 统计匹配的行数
-v : 显示没有被模式匹配到的行
-o : 只显示被模式匹配到的字符串
-q : 静默模式,不输出任何信息
-A # :after,后#行
-B # :before,前#行
-C # :context,前后各#行
-e :实现多个选项间的逻辑or关系
-w :匹配整个单词
-E : 使用扩展的正则表达式,egrep = grep -E
-F : 相当于fgrep,不支持正则表达式
PATTERN部分
以字符串的形式来给定匹配模板,可以使用普通字符串以及正则表达式(标准&扩展)
FILE部分
需要查找内容的文件
三、sed命令--擅长取行和替换
基本语法:
sed [option] 'script' [input file] ...
option部分
-n :不输出模式空间中未匹配上的内容stdout到屏幕,即不自动打印
-e :可以在sed命令中指定多个script脚本,多点编辑功能
-f :输入sed脚本,脚本中写着编辑命令
-r :支持使用扩展的正则表达式
-i :直接编辑源文件
script部分
1.不给地址:对全文进行处理
2.单地址:
n:指定的第n行,$:最后一行
/pattern/:被此模式所能够匹配到的每一行
3.地址范围:
n,m :定位从第n行开始至第m行(都是闭区间)
n,+k :定位从第n行开始,包括往后的k行
n,/pattern/ :定位从第n行开始,至指定模式匹配到的那一行
/pattern1/,/pattern2/ :定位从 pattern1 模式匹配开始,直到 pattern2 模式匹配之间的范围
4.步进方式:
1~2 :以1为起始行,然后步进2行向下匹配,即所有的奇数行
2~2 :以2为起始行,然后步进2行向下匹配,即所有的偶数行
5.编辑命令:
- d 删除模式空间匹配的行,并立即启用下一轮循环
- p 打印当前模式空间的内容,追加到默认输出之后
- a [\] text 在指定行后面追加文本,支持使用\n实现多行追加
- i [\] text 在行前面插入文本
- c [\] text 替换行为单行或多行文本
- w /path/somefile 保存模式匹配的行至指定文件
- r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
- = 为模式空间中的行打印行号
- !模式空间中匹配行取反处理
- s/// :查找替换,支持使用其他分隔符
- 替换标记: g -- 行内全局替换 p -- 显示替换成功的行 w /path/ to somefile 将替换成功的行保存至文件中
四、awk命令--擅长取列
awk是一个报表生成器,主要用于格式化输出。--格式化文本输出器
语法:
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk是按照行来读取文件的,根据输入分隔符切分成小部分(用内建变量来表示 $0,$1,$2等),$0表示显示整行
option选项
-F:指明输入字段的分隔符
-v:用来实现自定义变量 var=value
PATTERN
``:表示处理文件的所有行。
/pattern/ :表示处理正则匹配对应的行。
!/pattern/ :表示处理正则不匹配的行。
关系表达式:比如返回布尔类型的表达式,若结果为真则处理,假则不处理。对于非0非空字符串为真,其余为假。
n:表示处理第n行的文本。
BEGIN/END模式:BEGIN{}表。示仅在开始处理文件中的文本之前执行一次的程序,例如打印表头。END{}表示文本处理完成之后执行一次,例如汇总数据。
内建变量
FS:输入字段分隔符,默认为空白字符。也可使用-v指定。
OFS:输出字段分隔符。使用-v指定。
RS:输入时的换行符
ORS:输出时的换行符
NF:每一行的字段数量。加上$NF表示最后一列。
NR:文件的行数,打印出来是打印行号
FNR:多个文件中的行数分别计数
FILENAME:当前文件的文件名
ARGC:参数命令行中参数的个数
ARGV:返回数组,命令行中的每个参数
示例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue
此处ARGV[0] 是awk,固定为第0个参数。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue
awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd
指明冒号作为输入及输出的分隔符。同awk -F:...
自定义变量
方法1:-v var=value(区分字符的大小写)
方法2:在program中定义
示例:awk -v test='hello' 'BEGIN {print test}'
awk 'BEGIN {test='hello' print test}'
五、扩展-格式化打印(printf)
语法:
printf [format] [文本1] [文本2] ..
常用格式替换符:
%s 字符串
%f 浮点格式
%c ASCII字符,即显示对应参数的第一个字符
%d,%i 十进制整数
%o 八进制值
%u 不带正负号的十进制值
%x 十六进制值(a-f)
%X 十六进制值(A-F)
%% 表示%本身
常用转义字符:
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 表示\本身