一、sed简介
sed 是 stream editor 的缩写,流编辑器,主要用于对标准输出或文件进行逐行处理。
二、语法
语法格式
- stdout | sed [option] "pattern command" #对 | 前面输出的内容进行sed处理
- sed [option] "pattern command" file
option选项
- -n 只打印模式匹配行
- -f 编辑动作保存在文件中,-f 指定要执行的文件
- -e 直接在命令行进行sed编辑,默认选项
- -r 支持扩展正则表达式
- -i 直接修改文件内容
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除,所以 d 后面通常不接任何东西;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代,通常这个 s 的动作可以搭配正则表示法
- s/old/new 替换行内第一个 old 为 new
- s/old/new/g 行内所有 old 替换为 new
- s/old/new/2g 从第 2 行开始到文件末尾的所有 old 替换为 new
- s/old/new/ig 行内所有 old 替换为 new,忽略大小写
匹配模式(pattern)
三、实例
1、指定行前后追加内容
原文件test_sed.sh内容:
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
在testfile文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:
[root@liang shell]# sed -e '4 a newLine' test_sed.sh
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newLine
a 动作是在匹配的行之后追加字符串,追加的字符串中可以包含换行符(实现追加多行的情况)
追加一行的话前后都不需要添加换行符 \n
追加多行
sed -e '4 a newline\nnewline2' test_sed.sh
同理,指定行前插入内容
sed -e '4 i newline\nnewline2' test_sed.sh
2、打印指定行
打印第3-4行
Linux test [root@liang shell]# sed -n '3,4p' test_sed.sh
3、修改指定行为新的文本
将第二行内容修改为111
sed '2c 111' test_sed.sh
4、删除选中的行
sed '2,5d' test_sed.sh 删除2~5行
sed '/^#/d' test_sed.sh 删除以#开头的行
sed '/^#/,/8$/d' test_sed.sh 删除以#开头以8结尾的行,如果找不到8结尾的,会删除#开头的之后的所有行
sed '/^$/d' test_sed.sh 删除空行
5、替换指定字符串
sed 's/#Port 22/Port 2200/g' test_sed.sh #将‘#Port 22’替换为‘Port 2200’
6、数据的搜寻并显示
搜索有root关键字的行
sed -n '/root/p' test_sed.sh
7、使用拓展正则 -r
匹配有连续5位数字的行
sed -nr '/[0-9]{5}/ p' test_sed.sh
8、多个命令之间以分号隔开
sed -i '/root/ {p;s/#Port 22/Port 2200/g;/^#/d;/^$/d}' test_sed.sh
或者
sed -n '/root\|daemon/p' test_sed.sh
sed -n '/root/{/daemon/p}' test_sed.sh
================================================================================
================================================================================
=================================================================================
接下来我们讲grep:
一、简介
grep的全称是global regular expression print,是linux中最强大的文本搜索命令之一,常用于搜索文本文件中是否含有某些特定模式的字符串。该命令以行为单位读取文本并使用正则表达式进行匹配,匹配成功后打印出该行文本。
二、语法
grep [option] pattern [file1, file2, ...]
常用option选项:
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-r :递归搜索对目录下的所有文件进行搜索
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
-c :如果匹配成功,只输出匹配的行的数量统计
-E :等于egrep,支持拓展正则表达式
-i :忽略大小写
-v :取反,不匹配
-w :匹配整个单词
常用的pattern规则表达式
表达式 | 一个普通标题 |
^ | 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 |
$ | 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 |
. | 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 |
? | 匹配0或者一个字符 如:'gr?p'匹配g后接一个或0个r字符,然后是p。 |
* | 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 |
.* | 一起用代表任意字符。 |
[] | 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 |
[^] | 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 |
(..) | 标记匹配字符,如'(love)',love被标记为1。 |
< | 锚定单词的开始,如:'<grep'匹配包含以grep开头的单词的行。 |
> | 锚定单词的结束,如'grep>'匹配包含以grep结尾的单词的行。 |
x{m} | 重复字符x,m次,如:'o{5}'匹配包含5个o的行。 |
x{m,} | 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。x{m,n} # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5--10个o的行。 |
\w | 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 |
\W | \w的反置形式,匹配一个或多个非单词字符,如点号句号等。 |
\b | 单词锁定符,如: '\bgrep\b'只匹配grep。 |
三、常见用法举例
1、在文件中搜索一个字符串,返回包含此字符串的文本行:
[root@liang shell]# grep xy text0001.txt
4 xy 100 50 60 70
[root@liang shell]# grep "xy" text0001.txt
4 xy 100 50 60 70
在多个文件中搜索,-n显示行号
[root@liang shell]# grep -n "xy" text0001.txt text0002.txt text0003.txt
text0001.txt:5:4 xy 100 50 60 70
text0002.txt:1:xy
text0002.txt:5:xyxyxy
text0002.txt:7:grepxy
text0003.txt:1:xy
text0003.txt:2:xxy
text0003.txt:4:xxyy
text0003.txt:5:xyxyxy
text0003.txt:7:grepxy
搜索一个目录下的所有文件,列出包含指定字符串的文件名 -l
[root@liang shell]# grep -rl "xxy" ./
./text0003.txt
2、统计文件或者文本中包含匹配字符串的行数-c 选项
统计单个文件
[root@liang shell]# grep -r -c "xxy" text0003.txt
2
统计多个文件
[root@liang shell]# grep -c "xy" text0001.txt text0002.txt text0003.txt
text0001.txt:1
text0002.txt:3
text0003.txt:5
统计一个目录下的所有文件
[root@liang shell]# grep -cr "xy" dirpath
3、使用正则表达式 -E 选项
正则匹配符合条件的字符串显示匹配到的行
[root@liang shell]# cat text0001.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
4 xy 100.00 50 60 70
this is a. test line.
1105
[root@liang shell]# grep -E "[0-9]{3}" text0001.txt
4 xy 100.00 50 60 70
1105
-o只输出匹配到的内容
[root@liang shell]# echo this is a. test line. | grep -o -E "[a-z]+\."
a.
line.
其他常用用法
请对照常用的pattern规则表达式理解
grep -E 'x?y' text0002.txt x出现0-1次,y出现1次
grep -E 'x*y' text0002.txt x出现0-任意次,y出现1次
grep -E 'x{n}y' text0002.txt x出现n次,y出现1次
grep -E 'x+y' text0002.txt x出现1-任意次,y出现1次
grep -E 'x.y' text0002.txt xy中间有1个任意非换行符
grep -E 'x.*y' text0002.txt xy中间有任意个任意非换字符
4、不支持正则,按字面意思匹配(字符串匹配) -F
[root@liang shell]# grep -E 'x.*y' text0002.txt
xy
xcxcy
xxyxyxy
abx344dyc
grepx2y
x.*y
xxxxxxxxy
[root@liang shell]# grep -F 'x.*y' text0002.txt
x.*y
5、忽略匹配样式中的字符大小写:-i
[root@liang shell]# echo "hello world" | grep -i "HELLO"
hello world
6、打印匹配到的行之前或者之后的行
打印之前的行
[root@liang shell]# grep "test" -A 2 text0001.txt
this is a. test line.
1105
DSF
打印之后的行
[root@liang shell]# grep "test" -B 2 text0001.txt
3 Gao 99 83 93 91.66
4 xy 100.00 50 60 70
this is a. test line.
打印前后的行
[root@liang shell]# grep "test" -C 2 text0001.txt
3 Gao 99 83 93 91.66
4 xy 100.00 50 60 70
this is a. test line.
1105
DSF
如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
7、-w 匹配整个单词
[root@liang shell]# grep 'gr' text0002.txt
grp
gr dfd
xxgrpp
[root@liang shell]# grep -w 'gr' text0002.txt
gr dfd