当前讯息:【Shell文本三剑客--sed,grep】

2022-12-13 12:11:09 来源:51CTO博客

一、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 为 news/old/new/g 行内所有 old 替换为 news/old/new/2g 从第 2 行开始到文件末尾的所有 old 替换为 news/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.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

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.shsed -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结尾的单词的行。

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: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

2、统计文件或者文本中包含匹配字符串的行数-c 选项

统计单个文件

[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

3、使用正则表达式 -E 选项

正则匹配符合条件的字符串显示匹配到的行

[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中间有任意个任意非换字符

4、不支持正则,按字面意思匹配(字符串匹配) -F

[root@liang shell]# grep -E "x.*y" text0002.txtxyxcxcyxxyxyxyabx344dycgrepx2yx.*yxxxxxxxxy[root@liang shell]# grep -F "x.*y" text0002.txtx.*y

5、忽略匹配样式中的字符大小写:-i

[root@liang shell]# echo "hello world" | grep -i "HELLO"hello world

6、打印匹配到的行之前或者之后的行

打印之前的行

[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

如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:

7、-w 匹配整个单词

[root@liang shell]# grep "gr" text0002.txtgrpgr dfdxxgrpp[root@liang shell]# grep -w "gr" text0002.txtgr dfd

标签: 正则表达式 所有文件 标准输出

上一篇:天天快资讯:VM系列振弦采集模块 温度传感器使用及UART 通讯参数
下一篇:HTML有序、无序、定义列表的使用