Linux文本处理: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<<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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值