awk、grep、sed是linux操作文本的三大利器,三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
grep '' [option] pattern '' file
用于过滤/搜索特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
参数 | 功能 |
---|---|
-A<显示行数> | 除了显示符合范本样式的那一行之外,并显示该行之后的内容 |
-B<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前的内容 |
-C<显示行数> | 除了显示符合样式的那一行之外,并显示之前后的内容 |
-c | 统计匹配的行数 |
-e | 实现多个选项间的逻辑or关系 |
-E | 扩展的正则表达式 |
-f FILE | 从FILE获取PATTERN匹配 |
-F | 相当于fgrep |
-i --ignore-case | 忽略字符大小写的差别 |
-n | 显示匹配的行号 |
-o | 仅显示匹配到的字符串 |
-q | 静默模式,不输出任何信息 |
-s | 不显示错误信息 |
-v | 显示不被pattern匹配到的行,相当于[^]反向匹配 |
-w | 匹配整个单词 |
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
sed' '[options] ' ''[地址定界] command'' 'file' '(s)
参数 | 功能 |
---|---|
-n | 不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行 |
-e | 多点编辑,对每行处理时,可以有多个Script |
-f | 把Script写到文件当中,在执行sed时-f指定文件路径,如果是多个Script,换行写 |
-r | 支持扩展的正则表达式 |
-i | 直接将处理的结果写入文件 |
-i.bak | 将处理的结果写入文件之前备份一份 |
选项 | 参数 |
---|---|
d | 删除模式空间匹配的行,并立即启用下一轮循环 |
p | 打印当前模式空间内容,追加到默认输出之后 |
a | 在指定行后面追加文本,支持使用\n实现多行追加 |
i | 在行前面插入文本,支持使用\n实现多行追加 |
c | 替换行为单行或多行文本,支持使用\n实现多行追加 |
w | 保存模式匹配的行至指定文件 |
r | 读取指定文件的文本至模式空间中匹配到的行后 |
= | 为模式空间中的行打印行号 |
! | 模式空间中匹配行取反处理 |
匹配到的aa那行会被打印一遍,不匹配的行也会打印
-n不显示没有匹配的行
-i直接对文件进行处理
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "p" demo #不指定行,打印全文
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2s/b/B/g" demo #替换第2行的b->B
aaa
BBBB
AABBCCDD
[root@along ~]# sed -n "1,2p" demo #打印1-2行
aaa
bbbb
[root@along ~]# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
[root@along ~]# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2d" demo #删除第2行
aaa
AABBCCDD
[root@along ~]# sed -n "2p" demo #打印第2行
bbbb
[root@along ~]# sed "2a123" demo #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]# sed "1i123" demo #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]# sed "3c123\n456" demo #替换第3行内容
aaa
bbbb
123
456
[root@along ~]# sed -n "3w/root/demo3" demo #保存第3行的内容到demo3文件中
[root@along ~]# cat demo3
AABBCCDD
[root@along ~]# sed "1r/root/demo3" demo #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]# sed -n "=" demo #=打印行号
1
2
3
[root@along ~]# sed -n '2!p' demo #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]# sed 's@[a-z]@\u&@g' demo #将全文的小写字母替换为大写字母
AAA
BBBB
AABBCCDD
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
选项 | 功能 |
---|---|
-F fs | fs指定输入分隔符,fs可以是字符串或正则表达式 |
-v var=value | 赋值一个用户定义变量,将外部变量传递给awk |
-f scripfile | 从脚本文件中读取awk命令 |
变量:内置和自定义变量,每个变量前加 -v 命令选项
格式:
[root@along ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo #FS指定输入分隔符
hello world
linux redhat
along love
[root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
[root@along ~]# awk -F: '{print NF}' awkdemo
2
4
3
[root@along ~]# awk -F: '{print $(NF-1)}' awkdemo #显示倒数第2列
hello
lalala
love
[root@along ~]# awk '{print NR}' awkdemo awkdemo1
1
2
3
4
5
[root@along ~]# awk END'{print NR}' awkdemo awkdemo1
5
[root@along ~]# awk '{print FNR}' awkdemo awkdemo1
1
2
3
1
2
[root@along ~]# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
[root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1
3
[root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1
awk
[root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
[root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1
自定义变量( 区分字符大小写)
(1)-v var=value
① 先定义变量,后执行动作print
[root@along ~]# awk -v name="along" -F: '{print name":"$0}' awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you
② 在执行动作print后定义变量
[root@along ~]# awk -F: '{print name":"$0;name="along"}' awkdemo
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you
(2)在program 中直接定义
可以把执行的动作放在脚本中,直接调用脚本 -f
[root@along ~]# cat awk.txt
{name="along";print name,$1}
[root@along ~]# awk -F: -f awk.txt awkdemo
along hello
along linux
along along