文章目录

正则表达式Grep概述用法选项案例正则案例

Sed概述用法选项案例命令案例

正则表达式

正则表达式描述\转义符,将特殊字符进行转义,忽略其特殊意义^匹配行首,awk中,^则是匹配字符串的开始$匹配行尾,awk中,$则是匹配字符串的结尾^$表示空行.匹配除换行符\n之外的任意单个字符[ ]匹配包含在[字符]之中的任意一个字符[ ^ ]匹配[ ^ 字符]之外的任意一个字符[ - ]匹配[]中指定范围内的任意一个字符?匹配之前的项1次或者0次+匹配之前的项1次或者多次*匹配之前的项0次或者多次( )匹配表达式,创建一个用于匹配的子串{ n }匹配之前的项n次,n是可以为0的正整数{n,}之前的项至少需要匹配n次{n,m}指定之前的项至少匹配n次,最多匹配m次,n<=m\交替匹配,两边的任意一项ab(c|d)匹配abc或abd\b单词锁定符,如: \bgrep\b只匹配grep。\B匹配非单词边界,与\b作用相反\<匹配单词词首\>匹配单词词尾\w匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]\W匹配任何非单词字符。等价于"[ ^A-Za-z0-9_][[:space:]]空白字符[[:blank:]]空格字符和制表符[ \t][[:graph:]]空白字符之外的字符[[:digit:]][0-9][[:lower:]][a-z][[:upper:]][A-Z][[:alpha:]][a-Z] 或 [a-zA-Z][[:alnum:]][a-zA-Z0-9][[:word:]][a-zA-Z0-9 _ ][[:punct:]]标点符号

Grep

概述

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。

用法

语法格式:grep [选项] ”模式“ [文件] 选项

-i:忽略大小写-v:反向过滤-n:显示行号-E:正则表达式-o:只显示被模式匹配到的字符串。-c:显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。

选项案例

1. 在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:

grep match_pattern file_name

grep "match_pattern" file_name

2. 在多个文件中查找:

grep "match_pattern" file_1 file_2 file_3 ...

3. 输出除了"match_pattern"之外的所有行,-v 选项:

grep -v "match_pattern" file_name

4. 使用正则表达式 -E 选项:

grep -E "[1-9]+"

# 或

egrep "[1-9]+"

5.输出文件中匹配到的部分, -o 选项:

echo this is a test line. | grep -o -E "[a-z]+\."

line.

echo this is a test line. | egrep -o "[a-z]+\."

line.

6. 统计文件或者文本中包含匹配字符串的行数,-c 选项:

grep -c "text" file_name

3

7. 输出包含匹配字符串的行数 -n 选项:

#单个文件

grep -n 'i' ex.sh

1:i=$(df -h | awk '/\/$/{print $5}'

2:if [[ $i > 85 ]]; then

6:fi

#多个文件

正则案例

练习文档

cat >test.txt<

123 222 345

12345 789

my name is tanfei

my qq num is 191868516

my email is 191868516@qq.com

my ip is 192.168.3.15

My telephone num is 18995568216

Server_name is Softeem

Company Site is http://www.softeem.com

MMMMMMMM

192.168.3.15

EOF

例1:过滤出连续的数字

grep -E '[0-9]+' test.txt

egrep '[0-9]{1,}' test.txt

例2:过滤出连续的小写字母

grep -E '[a-z]+' test.txt

例3:过滤出以大写字母开头的行

grep '^[A-Z] test.txt

例4:过滤出非大写字母开头的行

grep '^[^A-Z] test.txt

grep -v '^[A-Z] test.txt

例5:过滤出非数字开头的行

grep -E '^[^0-9]' test.txt

grep -Ev '^[0-9]' test.txt

例6:过滤出以m或M结尾的行

grep -E '[mM]$' test.txt

例7:过滤出以com结尾的行

grep 'com$' test.txt

例8:过滤出包含特殊字符的行

grep '\W' test.txt

例9:过滤出所有的域名

grep -E '([a-Z]+\.){1,2}[a-Z]+\>' test.txt

例:

www.baidu.com

sports.qq.com

qq.com

baidu.com

例10:统计单词qq出现的次数

grep -Eo '\' test.txt | wc -l

grep -Eoc '\' test.txt

例11:统计0-255的数字

grep -E '\<(([0-9]|[1-9][0-9]|[1][0-9]{2}|2[0-4][0-9]|25[0-5]\.)\>' test.txt

例子12:精确匹配IP地址

grep -Eo '\<((([0-9]|[1-9][0-9]|[1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|[1][0-9]{2}|2[0-4][0-9]|25[0-5]))\>' test.txt

例13:找出文件中空白行的行号

grep -vn '\w' test.txt

grep -nv '^[[:graph:]]' test.txt

Sed

概述

sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space) 接着用 sed 命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。 接着处理下一行,这样不断重复,直到文件末尾。 文件内容并没有改变,除非你 使用重定向存储输出。 Sed 要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

用法

语法:sed 选项] '命令' file(s)

正则使用

与 grep一样,sed 在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。 正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。

使用基本元字符集 $, . , * , [], < >, (),{} 使用扩展元字符集 ?, +, { }, |, ( ) 使用扩展元字符的方式 sed -r

选项参数

-e 允许多项编辑 -n 取消默认的输出 -i 直接修改对应文件 -r 支持扩展元字符

命令参数(都需要在单引号中)

a 在当前行后添加一行或多行 c 在当前行进行替换修改 d 在当前行进行删除操作 i 在当前行之上插入文本 p 打印匹配的行或指定行 n 读入下一输入行,从下一条命令进行处理 ! 对所选行以外的所有行应用命令 s 替换命令标志

g 行内全局替换 i 忽略替换大小写

h 把模式空间里的内容重定向到暂存缓冲区 H 把模式空间里的内容追加到暂存缓冲区 g 取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容 G 取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面

选项案例

例1:-e 允许多项编辑

sed -e '1,9d' -e 's#root#alex#g' /etc/passwd

//先删除1到9行,然后将文件中的root替换为alex

例2:-i 直接修改对应文件

sed -i '30i listen 80;' passwd

//-i为修改该文件

//30i为在第三十行上面添加一行内容

例3:-n 取消默认的输出

sed -n '1p' person.txt

# 100,root,CEO

sed '1p' person.txt

# 100,root,CEO

# 100,root,CEO

# 101,softeem,CEO

//sed默认会输出文件全部内容,-n是为了输出我们需要的内容

//1p是指打印第一行,不加-n打印全文还再次打印第一行

例4:-r 支持扩展元字符

sed -r '/^#|^$/d' person.txt

//删除以'#'号开头或'^$'(空白行)的行

//使用扩展元字符集 ?, +, { }, |, ( )。需要使用-r选项

命令案例

练习文档

cat > person.txt <

案例1:插入指定内容

//在第8行下面添加一行内容

sed -i '8a 109,chen,CEO' person.txt

//在第1行上面添加一行内容

sed -i '1i 100,root,CEO' person.txt

案例2:替换指定内容

'c:整行替换'

//将第一行的内容修改为‘101,root,CTO’

sed -i '1c 101,root,CTO' person.txt

//正则匹配以'101'开头的行, 然后进行替换

sed -i '/^101/c 101,ROOT,CTO' person.txt

's###或s///:替换指定字符串'

//替换每行出现的第一个root

sed 's/root/alice/' person.txt

//替换以root开头的行

sed 's/^root/alice/' person.txt

//查找匹配到的行, 并修改内容

sed -r 's/^([0-9]{3}),/user:/' person.txt

//匹配包含有root的行进行替换,g:行内全局替换

sed -r 's/root/alice/g' person.txt

//匹配包含有root的行进行替换,i:忽略大小写

sed -r 's/root/alice/gi' person.txt

案例3:删除文件内容

//删除指定行或指定内容的行

sed '1,3d' person.txt

sed '/root/d' person.txt

//删除正则匹配内容

sed -r '/[0-9]{3}/d' person.txt

//删除配置文件中'#'号开头的注释行

sed '/^#/d' /etc/vsftpd/vsftpd.conf

//删除配置文件中含有tab键的注释行

sed -r '/^[ \t]*#/d' /etc/vsftpd/vsftpd.conf

//删除无内容空行

sed -r '/^[ \t]*$/d' /etc/vsftpd/vsftpd.conf

//删除注释行及空行

sed -r '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf

sed -r '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf

sed -r '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf

案例4:打印指定内容

//打印匹配halt的行

sed -n '/halt/p' /etc/passwd

halt:x:7:0:halt:/sbin:/sbin/halt

//打印第二行的内容

sed -n '2p' /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

//打印最后一行

sed -n '$p' /etc/passwd

//打印以三个数字开头的行

sed -nr '/^[0-9]{3}/p' person.txt

案例5:反向过滤

//打印不以三个数字开头的行

sed -nr '/^[0-9]{3}/!p' person.txt

//删除除含有root以外的行

sed -r '/root/!d' person.txt

案例6:匹配项下一行的处理

//匹配root的行, 删除root行的下一列

sed '/root/{n;d}' person.txt

//替换匹配root行的下一列

sed '/root/{n; s/bin/test/}' person.txt

案例七:后向引用

'第一个()的引用为\1,第二个()的引用为\2,以此类推'

//含有root行的root修改为root-alice

sed -r 's#(root)#\1-alice#g' person.txt

查看原文