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 三个子命令,适用于不通的场景,具体如下:

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            垂直制表符
  \\             表示\本身


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM