正则三剑客grep、sed、awk

正则

  • 正则就是一串有规律的字符串,掌握好正则对于编写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,分段:
第一段 ([^:]+)#^:表示冒号之外的字符
表示开头至一个或多个非冒号的字符。
第二段 (:.:)
表示冒号开头,和冒号结尾的内容。
第三段 ([^:]+)
表示非冒号的一个或多个字符然后结尾。

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

awk

5.45 awk

格式:

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

例: awk -F ':' '' test |awk -F ':' '{print $1}'
5-90.png
以上就是以冒号为分割符,输出第1段的内容。
5-91.png
$1、$2、$3分别表示第一段、第二段、第三段。而$0表示整行。

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

5-92.png
注意,这个选项对$0无效。
5-93.png
手动变更分割符

条件匹配

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

5-94.png

多条件匹配

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

5-95.png

匹配条件为逻辑判断

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

5-96.png
数字逻辑运算
为数字加双引号,将会把他的属性变更为字符串型。
5-97.png
取反选择
5-98.png

多条件判断

5-99.png
&&连接表示并且

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

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

5-100.png

内置变量NF 与NR

5-101.png
$NF与$NR表示段数量和行数量。

变更某一段的输出值

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

5-102.png
变更某一段的输出值,可以和{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(行数)的统计。

转载于:https://my.oschina.net/u/4080783/blog/3038471

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值