正则表达式
正则表达式 | 描述 |
---|---|
\ | 转义符,将特殊字符进行转义,忽略其特殊意义 |
^ | 匹配行首,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<<EOF
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 '\<qq\>' test.txt | wc -l
或
grep -Eoc '\<qq\>' 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 <<EOF
101,softeem,CEO
102,tanfei,CTO
103,ti,CTO
104,tai,CTO
105,tani,CTO
106,zhangsan,COO
107,lisi,CFO
108,wangwu,CIO
EOF
案例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