shell工具之grep,sed

1. grep工具

1. 功能

grep是一个非常强大的命令,可以和正则表达式配合使用,实现了对文本的过滤和查找。

2. 常用选项

选项 功能
–color 使匹配到的文本高亮显示
-E 使用扩展模式
-v 选择未匹配的行
-i 忽略大小写
-L 输出未匹配的文件
-I 输出匹配的文件名
-c 统计文本中匹配的行出现的数目
-n 输出匹配数据的同时打印行号
-H 对于每一处匹配,都打印文件名
-r 递归,如果没有指定目录,则使用当前目录,否则使用指定目录
-B 显示匹配到的行的同时,显示#开头的行
-P 使用P模式
-q 安静模式匹配
-o 只输出文件中匹配到的部分

示例
(1)在文件中搜索一个单词,命令返回包含“match_pattern”的文本行

grep match_pattern file_name

这里写图片描述
(2)在多个文件中查找

grep "match_pattern" file1 file2 file3 ...

这里写图片描述
(3) 输出除要匹配的之外的所有行

grep -v 'match_pattern' file

这里写图片描述
(4) 匹配部分高亮显示

grep --color 'match' file

这里写图片描述
(5) 使用正则表达式匹配(扩展模式)

grep -E 'match' file

这里写图片描述
(6)只输出文件中匹配到的部分

grep -o 'match' file

这里写图片描述
(7) 统计文件或者文本中包含字符串的行数

grep -c 'match' file

这里写图片描述
(8) grep递归搜索,在多级目录中对文本进行递归搜索

grep -r 'match' file

这里写图片描述
(9) grep 静默输出,

grep -q 'match' file

#不会输出任何信息,如果命令成功返回0,失败返回非0.一般用于条件测试

这里写图片描述
(10)使用0值字节后缀的grep 和xargs

测试文件:
echo “aaa” > file1
echo “bbb” > file2
echo “ccc” > file3

grep “aaa” file* -lZ | xargs -0 rm

执行后会删除file1,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
这里写图片描述

3. 模式

grep工具分为三个模式:

(1)基准模式(basic RegEx):即在普通模式下使用grep,对于正则表达式的某些特殊字符,需要使用转义符号将普通字符转化为特殊字符。grep后面不跟任何参数。
(2)扩展模式(Extended RegEx):一般在扩展模式下使用正则表达式匹配。grep后面跟参数-E。
(3)Perl模式(Perl RegEx):在Perl模式下,可以使用正则表达式的一些特殊替换字符,比如\d表示[0-9]等。grep后面跟参数-P。

4. 贪婪模式

grep工具在匹配文本时,按照贪婪模式匹配。即在找到一个可匹配的项时继续向后查找,如果有其他可匹配的项,就一起打印出来。

二. sed流编辑器

1. sed简介

sed是一种流编辑器,它可以配合正则表达式完美使用。
sed在处理文本时,首先按行将文本中的数据拿到自己在内存中开辟的空间中,这段空间称为——模式空间(pattern space)。
接着sed处理在模式空间的行,处理完成后,将结果输出到屏幕上。接着重复执行上述动作,处理下一行。
简而言之,sed的处理文本分为两步,先正则匹配,再执行相应的命令进行处理。
sed工具默认按照基准模式匹配。

2. 常见基本使用

(1)命令行使用

sed [op] 'command' file...

(2)脚本使用

sed [op] -f 脚本 file...

(3) 打印匹配pattern的行—p命令

sed '/pattern/p' file 

这里写图片描述
注:使用p命令需要注意,sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内 容打印出来之外还额外打印一遍匹配pattern的行 。
(4)只输出处理结果—-n选项

sed -n '/pattern/p' file

这里写图片描述
(5) 删除匹配的行—d命令

sed -n '/pattern/d' file

这里写图片描述
**注:**sed命令不会修改源文件,删除命令只表示某些行不打印输出,而不是从源文件中删除。
(6)影响原文件—-i选项

sed -i '/pattern/d' file

这里写图片描述
(7) 替换字符串

/pattern/s/pattern1/pattern2/
# 查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为 pattern2 

这里写图片描述
这里写图片描述
(8)带g命令的替换

/pattern/s/pattern1/pattern2/g
#查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为 pattern2 使

这里写图片描述
(9)逆置单词
这里写图片描述
(10)定址
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed 将处理输入文件的所有行。

[jinyuyu@localhost progammer]$ for i in {a..z};do echo $i;done >>file
[jinyuyu@localhost progammer]$ cat file
bbbb

ccccc
ddddd
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
[jinyuyu@localhost progammer]$ sed -n '3,5p' file
ccccc
ddddd
a
[jinyuyu@localhost progammer]$ sed -n '/^f/,/^h/p' file
f
g
h
[jinyuyu@localhost progammer]$ sed -n '/^f/,15p' file
f
g
h
i
j
k

(11)sed不能用于if命令的条件检测,因为它的退出码总是0.除非语法错误。

3. sed|高级命令

高级命令用于模式空间保持保持空间的数据交流
模式空间:数据直接在它上面进行处理
保持空间:在进行数据处理时,作为数据的暂存区域。

命令 功能
g 将保持空间的内容拷贝到模式空间
G 将保持空间的内容追加到模式空间
h 将模式空间的内容拷贝到保持空间
H 将模式空间的内容追加到保持空间
d 删除匹配中的行,并读入下一行到pattern中
D 删除多行的第一行,不读入下一行
x 交换模式空间和保持空间的内容
n 读取下一行到模式空间
N 将下行添加到pattern space中

示例
(1)给每行结尾添加一行空行

[jinyuyu@localhost progammer]$ for i in {1..10};do echo $i;done > file
[jinyuyu@localhost progammer]$ cat file
1
2
3
4
5
6
7
8
9
10
[jinyuyu@localhost progammer]$ sed 'G' file
1

2

3

4

5

6

7

8

9

10

(2)用sed模拟tac的功能(倒序输出)

[jinyuyu@localhost progammer]$ sed '1!G;h;;$!d' file
10
9
8
7
6
5
4
3
2
1

(3)追加匹配行到文件结尾

[jinyuyu@localhost progammer]$ sed -e '/^7\|^9/H' -e '$G' file
1
2
3
4
5
6
7
8
9
10

7
9
[jinyuyu@localhost progammer]$ sed -e '/^7\|^9/{H;d}' -e '$G' file
1
2
3
4
5
6
8
10

7
9

注:-e选项表示对一行做多次处理动作
(4)打印奇数行和偶数行

[jinyuyu@localhost progammer]$ sed -n 'n;p' file
2
4
6
8
10
[jinyuyu@localhost progammer]$ sed -n 'p;n' file
1
3
5
7
9

(5)将一列转换为一行

[hb@localhost test]$ sed -n 'H;${x;s/\n/ /g;p}' file  
1 2 3 4 5 6 7 8 9 10 

(6)求1~100的求和

[jinyuyu@localhost progammer]$ seq 100 | sed -n 'H;${x;s/\n/+/g;s/^+//;p}' 
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[jinyuyu@localhost progammer]$ seq 100 | sed -n 'H;${x;s/\n/+/g;s/^+//;p}' | bc
5050
[jinyuyu@localhost progammer]$ seq 100 | sed ':a;N;s/\n/+/g;{$!ba}' | bc
5050
[jinyuyu@localhost progammer]$ seq 100 | sed ':a;N;s/\n/+/g;{$!ba}'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100

注:$!表示最后一行不做。:a表示定制a标签。$!ba表示最后一行不跳转至a标签。

[jinyuyu@localhost progammer]$ seq 100 | sed ':a;N;{$!ba};s/\n/+/g;'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100

shell工具续下节awk&find!

猜你喜欢

转载自blog.csdn.net/qq_37954088/article/details/80956865