sed 是 stream editor 的缩写,流编辑器,主要用于对标准输出或文件进行逐行处理。
(资料图片仅供参考)
原文件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.shHELLO 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
打印第3-4行
Linux test [root@liang shell]# sed -n "3,4p" test_sed.sh
将第二行内容修改为111
sed "2c 111" test_sed.sh
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 删除空行
sed "s/#Port 22/Port 2200/g" test_sed.sh #将‘#Port 22’替换为‘Port 2200’
搜索有root关键字的行
sed -n "/root/p" test_sed.sh
匹配有连续5位数字的行
sed -nr "/[0-9]{5}/ p" test_sed.sh
sed -i "/root/ {p;s/#Port 22/Port 2200/g;/^#/d;/^$/d}" test_sed.sh
或者
sed -n "/root\|daemon/p" test_sed.shsed -n "/root/{/daemon/p}" test_sed.sh
================================================================================
================================================================================
=================================================================================
grep的全称是global regular expression print,是linux中最强大的文本搜索命令之一,常用于搜索文本文件中是否含有某些特定模式的字符串。该命令以行为单位读取文本并使用正则表达式进行匹配,匹配成功后打印出该行文本。
grep [option] pattern [file1, file2, ...]
-n :显示行号-o :只显示匹配的内容-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容-r :递归搜索对目录下的所有文件进行搜索-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl "root" /etc-A :如果匹配成功,则将匹配行及其后n行一起打印出来-B :如果匹配成功,则将匹配行及其前n行一起打印出来-C :如果匹配成功,则将匹配行及其前后n行一起打印出来-c :如果匹配成功,只输出匹配的行的数量统计-E :等于egrep,支持拓展正则表达式-i :忽略大小写-v :取反,不匹配-w :匹配整个单词
表达式 | 一个普通标题 |
^ | 锚定行的开始 如:"^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结尾的单词的行。 |
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。 |
[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:xytext0002.txt:5:xyxyxytext0002.txt:7:grepxytext0003.txt:1:xytext0003.txt:2:xxytext0003.txt:4:xxyytext0003.txt:5:xyxyxytext0003.txt:7:grepxy
搜索一个目录下的所有文件,列出包含指定字符串的文件名 -l
[root@liang shell]# grep -rl "xxy" ././text0003.txt
统计单个文件
[root@liang shell]# grep -r -c "xxy" text0003.txt2
统计多个文件
[root@liang shell]# grep -c "xy" text0001.txt text0002.txt text0003.txt text0001.txt:1text0002.txt:3text0003.txt:5
统计一个目录下的所有文件
[root@liang shell]# grep -cr "xy" dirpath
正则匹配符合条件的字符串显示匹配到的行
[root@liang shell]# cat text0001.txt ID Name PHP Linux MySQL Average1 Liming 82 95 86 87.662 Sc 74 96 87 85.663 Gao 99 83 93 91.664 xy 100.00 50 60 70 this is a. test line.1105[root@liang shell]# grep -E "[0-9]{3}" text0001.txt4 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中间有任意个任意非换字符
[root@liang shell]# grep -E "x.*y" text0002.txtxyxcxcyxxyxyxyabx344dycgrepx2yx.*yxxxxxxxxy[root@liang shell]# grep -F "x.*y" text0002.txtx.*y
[root@liang shell]# echo "hello world" | grep -i "HELLO"hello world
打印之前的行
[root@liang shell]# grep "test" -A 2 text0001.txtthis is a. test line.1105DSF
打印之后的行
[root@liang shell]# grep "test" -B 2 text0001.txt3 Gao 99 83 93 91.664 xy 100.00 50 60 70 this is a. test line.
打印前后的行
[root@liang shell]# grep "test" -C 2 text0001.txt3 Gao 99 83 93 91.664 xy 100.00 50 60 70 this is a. test line.1105DSF
如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
[root@liang shell]# grep "gr" text0002.txtgrpgr dfdxxgrpp[root@liang shell]# grep -w "gr" text0002.txtgr dfd