sed与AWK
文本三剑客---grep/sed/AWK
grep
概念
grep 是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
格式
grep 选项 正则表达式 文件名
选项
-i 忽略字符大小写
[root@localhost ~]# grep -i qqwwee /etc/passwd
QQWWEE:x:8888:8888::/home/QQWWEE:/bin/bash
qqwwee:x:4444:4444::/home/qqwwee:/bin/bash
-n 显示匹配的行号
[root@localhost ~]# grep -n qqwwee /etc/passwd
44:qqwwee:x:4444:4444::/home/qqwwee:/bin/bash
-c 统计匹配的行数
[root@localhost ~]# grep -c root /etc/passwd
2
-v 显示不被pattern匹配到的行,即取反
[root@localhost data]# cat txt
a
b
1
2
3
4
5
6
7
8
9
0
10
c
v
AA
XC
[root@localhost data]# grep -v "^$" txt
a
b
1
2
3
4
5
6
7
8
9
0
10
c
v
AA
XC
-o 仅显示匹配到的字符串
[root@localhost data]# grep -0 "1" txt
1
--
10
-q 静默模式,不输出任何信息
-A # after, 匹配到的后#行
[root@localhost data]# grep -A 2 2 txt
2
3
4
-B # before, 匹配到的前#行
[root@localhost data]# grep -B 2 5 txt
3
4
5
-C # context, 匹配到的前后各#行
[root@localhost data]# grep -C 2 5 txt
3
4
5
6
7
-E 使用ERE,相当于egrep;使用高级用法
-F 不支持正则表达式,相当于fgrep
正则表达式
正则表达式,又称规则表达式,是一种文本模式,包括普通字符和特殊字符,是计算机科学中的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
此外,正则表达式具有多种语法和规则,例如元字符、字符类、重复、选择、分组等,这些语法和规则可以用于构建复杂的匹配模式,以满足不同的需求。同时,许多程序设计语言都支持利用正则表达式进行字符串操作,如Perl、PHP、Java、Python、Ruby等。
1 元字符(字符匹配)
[root@localhost data]# cat txt
a
b
c
1
2
3
A
B
C
,
.
!
%
|
———————————————————————————————————————————————————————
. 匹配任意单个字符,可以是一个汉字
[root@localhost data]# grep . txt
a
b
c
1
2
3
A
B
C
,
.
!
%
|
[] 匹配指定范围内的任意单个字符
[root@localhost data]# grep [abc] txt
a
b
c
[^] 匹配指定范围外的任意单个字符
[root@localhost data]# grep [^abc] txt
1
2
3
A
B
C
,
.
!
%
|
[:alnum:] 字母和数字
[root@localhost data]# grep [[:alnum:]] txt
a
b
c
1
2
3
A
B
C
[:alpha:] 代表任何英文大小写字符
[root@localhost data]# grep [[:alpha:]] txt
a
b
c
A
B
C
[:lower:] 小写字母
[root@localhost data]# grep [[:lower:]] txt
a
b
c
[:upper:] 大写字母
[root@localhost data]# grep [[:upper:]] txt
A
B
C
[:blank:] 空白字符(空格和制表符)
[root@localhost data]# grep [[:blank:]] txt
[:space:] 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[root@localhost data]# grep [[:space:]] txt
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[root@localhost data]# grep [[:punct:]] txt
,
.
!
%
|
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符
2 表示次数
[root@localhost data]# cat txt
a
a
b
b
c
c
1
1
2
2
3
3
A
A
B
B
C
C
,
.
!
%
|
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
![屏幕截图 2024-05-17 141858](D:\桌面\屏幕截图 2024-05-17 141858.png)
.* #任意长度的任意字符 不包括0次
![屏幕截图 2024-05-17 141943](D:\桌面\屏幕截图 2024-05-17 141943.png)
? #匹配其前面的字符出现0次或1次,即:可有可无
![屏幕截图 2024-05-17 144359](D:\桌面\屏幕截图 2024-05-17 144359.png)
\+#匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
[root@localhost data]# grep "a\+" txt
a
a
\{n\} #匹配前面的字符n次
[root@localhost data]# grep "c\{1\}" txt
c
c
[root@localhost data]# grep "c\{2\}" txt
\{m,n\} #匹配前面的字符至少m次,至多n次
[root@localhost data]# cat aa
1
11
111
2
22
222
3
33
333
[root@localhost data]# cat aa|grep "1\{2,3\}"
11
111
\{,n\} #匹配前面的字符至多n次,<=n
![屏幕截图 2024-05-17 152332](D:\桌面\屏幕截图 2024-05-17 152332.png)
\{n,\} #匹配前面的字符至少n次
[root@localhost data]# cat aa|grep "3\{2,\}"
33
333
3 位置锚定
^ #行首锚定, 用于模式的最左侧
[root@localhost data]# cat aa
123
234
345
456
567
678
789
[root@localhost data]# cat aa|grep "^2"
234
$ #行尾锚定,用于模式的最右侧
[root@localhost data]# cat aa|grep "3$"
123
^PATTERN$ #用于模式匹配整行 (单独一行 只有root)
[root@localhost data]# cat aa|grep "^123$"
123
^$ #空行
[root@localhost data]# cat aa|grep "^$"
[1]*$ # 空白行 tab 换行 回车
[root@localhost data]# cat aa|grep "^[[:space:]]*$"
< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
[root@localhost data]# grep "\b2" aa
234
> 或 \b #词尾锚定,用于单词模式的右侧
[root@localhost data]# grep "5\b" aa
345
<PATTERN> / "\bPATTERN\b" #匹配整个单词
[root@localhost data]# grep "\<345\>" aa
345
[root@localhost data]# grep "\b456\b" aa #"\"是转义
456
4分组或其他
分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
[root@localhost data]# cat aa
123
234
345
456
567
678
789
[root@localhost data]# grep -E "(45)" aa
345
456
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ... 分组
[root@localhost data]# cat txt
12
123
1233
12333
123333
1233333
[root@localhost data]# grep -E "123{3}" txt
12333
123333
1233333
[root@localhost data]# grep -E "1|3" aa
123
234
345
[root@localhost data]# grep -E "1|3" txt
12
123
1233
12333
123333
1233333
sed
sed是行编辑器
格式
sed [选项] {脚本(如果没有其他脚本)} [输入文件]
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
用法
sed [option]... 'script;script;...' [input file...]
sed 选项 自身脚本语法 支持标准输入管道 文件
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
sed 脚本格式
由'地址+命令'组成
地址
-
不给地址:对全文进行处理(比如行号)
-
单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行,正则表达式
[root@localhost data]# cat kk
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost data]# sed -n "3p" kk
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-
地址范围:
(#,#) #从#行到第#行,3,6 从第3行到第6行
(#,+#) #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/ 第一个正则表达式 到 第二个正则表达式之间的行
,/pat/ 从#号行为开始找到 pat为止 3 , /^r/
/pat/,# 找到#号个pat为止
[root@localhost data]# sed -n "2,/^4/p" aa
234
345
456
[root@localhost data]# cat aa
123
234
345
456
567
678
789
[root@localhost data]# sed -n "3,6p" aa
345
456
567
678
[root@localhost data]# sed -n "3,+2p" aa
345
456
567
[root@localhost data]# sed -n "/^2/,/^6/p" aa
234
345
456
567
678
[root@localhost data]# sed -n "2,/^4/p" aa
234
345
456
[root@localhost data]# sed -n "/^2/,4p" aa
234
345
456
4.步进:~
1~2 奇数行
[root@localhost data]# sed -n '1~2p' aa
123
345
567
789
2~2 偶数行
[root@localhost data]# sed -n '2~2p' aa
234
456
678
命令
p 打印当前模式空间内容,追加到默认输出之后
[root@localhost data]# sed p aa
123
123
234
234
345
345
456
456
567
567
678
678
789
789
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a []text 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q 结束或退出sed
AWK
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
用法
awk [ -F re] [parameter...] ['prog'] [-f progfile]
变量选项
- FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
- OFS:输出时的分隔符
- NF:当前处理的行的字段个数
- NR:当前处理的行的行号(序数)
- $0:当前处理的行的整行内容
- $n:当前处理行的第n个字段(第n列)
- FILENAME:被处理的文件名
- RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
[:space:] ↩︎