Linux三剑客详解(grep、sed、awk)
前⾔
  在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 三个⼦命令,适⽤于不通的场景,具体如下:

3.fgrep 简化版的grep命令,不⽀持正则表达式,但搜索速度快,系统资源使⽤率低
基本语法:
grep [options] PATTERN []
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是⼀个报表⽣成器,主要⽤于格式化输出。--格式化⽂本输出器grep命令有什么用
语法:
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            垂直制表符
\\            表⽰\本⾝

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。