文章目录
正则表达式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 '\ 或 grep -Eoc '\ 例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
发表评论