正则三剑客grep、sed、awk

血红的双手。 提交于 2019-11-29 17:10:29

正则

  • 正则就是一串有规律的字符串,掌握好正则对于编写shell脚本有很大帮助,各种编程语言中都有正则,原理是一样的
  • 正则三剑客
    • grep
    • sed
    • awk

 grep

grep用法:grep [参数] '关键字' 文件名    #关键词也可以是正则表达式  grep [-cinvABC] 'word' filename   -c 统计包含'关键字'的行数。既使一行有多个关键字,也会按一行计算。  -i 筛选'关键字'时不区分大小写。  -n 筛选'关键字'时显示关键字所在的行号。  -v 反向选择,也就是'关键字'以外的内容。  -r 查询关键词时遍历路径下的子目录。  -An 这里的n是一个数字。作用是过滤出符合要求的行以及下面的“n”行。  -Bn 同上,区别为符合要求的行以及上面的“n”行。  -Cn 同上,区别为符合要求的行以及上下的各“n”行。   grep -n 'root' /etc/passwd   #显示出现root的行数   grep -nv 'nologin' /etc/passwd    #不显示出现root的行数   grep '[0-9]'/etc/inittab       #显示 /etc/inittab文件下出现0-9关键词的行数   grep -v '[0-9]'/etc/inittab    #显示 /etc/inittab文件下出现0-9关键词之外的行数   grep -v '^#' /etc/inittab      #^符号表示开头,#符号表示结尾。此处为显示/etc/inittab内容中不带空行的内容   grep -v '^#' /etc/inittab|grep -v  '^$'       grep '^[^a-zA-Z]' test.txt   grep 'r.o' test.txt   grep 'oo*' test.txt   grep '.*' test.txt   grep 'o\{2\}' /etc/passwd   egrep 'o{2}' /etc/passwd   egrep 'o+' /etc/passwd   egrep 'oo?' /etc/passwd   egrep 'root|nologin' /etc/passwd   egrep '(oo){2}' /etc/passwd

参数-E以及egrep

egrep == grep -E

egrep可以在'关键字'中使用扩展正则表达式中的字符。 扩展正则表达式字符:
# 井号
| 竖线
() 小括号
+ 加号
? 问号
{} 花括号

正则表达式

[] 方括号表示一个范围,可以是括号内的任意一个字符。
[a-z] 所有的小写字母
[A-Z] 所有的大写字母
[a-zA-z] 所有的字母
[0-9] 所有的数字。
^ 即为shift+6。表示以什么什么开头。例如'^#'即为以#号开头。
$ 即为shift+4。表示以什么什么结尾。例如'g$'即为以g结尾。
^$ 用来表示一个空行。就是开头至结尾中间啥也没有。
. 表示任意一个字符。
* 表示匹配星号左边的字符0次或多次。
+ 表示匹配加号左边的字符一次或多次。
? 表示匹配问号左边的字符零次或两次。
{n} 其中n为数字或是范围。当内容是范围时用逗号分隔。表示匹配花括号左边的一个字符n次。
() 小括号中的内容被视为一个整体。
.* 表示任意个字符

sed

格式:sed 命令参数 '动作范围'参数 文件或路径

sed 命令参数

-n 只显示匹配的行。
-e 执行多个匹配条件。
-r 使用扩展正则表达式字符。等同于grep -E和egrep的关系。
-i 执行结果直接写入文件。

sed动作范围参数

p 显示所有内容。由于p会显示所有内容,所以一般有p的场和都加-n。
d 显示动作范围以外的内容。
I 大写的I表示内容不区分大小写。

sed的查找替换功能

sed 命令中单引号中间的内容可以使用类似vi命令中的查找替换。
普通查找替换: 's/源内容/替换内容/g'

查找替换的内容里包含“/”分界符的处理方案

1,在“/”的前面加“\”脱义符。使它成为字符而不是命令。
2,使用“#”或“@”代替“/”的分界符功能。注间,这里是代替分界符而不是查找替换内容中的“/”。

查找替换的其他使用方法

1,删除指定内容。
可以在源内容里使用[]来指定范围。比如[1-9]为数字,[a-z]是小写字母。
在[]内使用“^”也就是shift+6符号。是反向选择的意思。比如[^1-9]就是数字以外全部的意思。
2,替换内容中的&符号。可以代表源内容的每一行。
例:sed 's/.*/1234&/' test
就是在每一行的开头加1234。反之就是在未尾加。

对文件内容顺序调换的方法:

1,分段:
第一段 ([^:]+)#^:表示冒号之外的字符
表示开头至一个或多个非冒号的字符。
第二段 (:.:)
表示冒号开头,和冒号结尾的内容。
第三段 ([^:]+)
表示非冒号的一个或多个字符然后结尾。


2,调换位置
使用\反斜杠加数字表示分段,然后重新排序。
sed -r 's/([^:]+)(:.
:)([^:]+)/\3\2\1/' test

awk

5.45 awk

格式:

awk -F '分割符' '动作' 文件名

例: awk -F ':' '' test |awk -F ':' '{print $1}'


以上就是以冒号为分割符,输出第1段的内容。


$1、$2、$3分别表示第一段、第二段、第三段。而$0表示整行。

自定义输出结果的分割符'{OFS="#"}'


注意,这个选项对$0无效。


手动变更分割符

条件匹配

awk -F ':' '$1 ~/oo/' test

多条件匹配

awk -F ':' '/root/ {print $1,$3} /test/ {print$1,$3,$4}' test

匹配条件为逻辑判断

[root@localhost tmp]# awk -F ':' '$3 == 0' test


数字逻辑运算
为数字加双引号,将会把他的属性变更为字符串型。


取反选择

多条件判断


&&连接表示并且

在有{OFS="#"}的情况下添加筛选条件

awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd

内置变量NF 与NR


$NF与$NR表示段数量和行数量。

变更某一段的输出值

awk -F ':' '$1="aaa"' test


变更某一段的输出值,可以和{OFS="#"}放在同一个单引号里。

统计某一段的值

awk -F ':' '{(sum=sum+$3)}; END {print sum}' /etc/passwd 

awk的完整形式:
awk -F ':' 'BEGIN {}; {条件}; END{}' filename
其中BEGIN和END都可以省略。中间的条件是依次执行文件中的每一行。
比如这个{(sum=sum+$3)}.    #或者sum+=¥3
他就会执行这个文件的NR(行数)的统计。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!