Linux-grep、sed、awk命令基本操作
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
1、grep
1.1 什么是grep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。Linux系统支持三种形式的grep命令,大儿子就是grep。二儿子兴趣爱好多-egrep,简称扩展grep命令,其实和grep -E等价,支持基本和扩展的正则表达式。小儿子跑的最快-fgrep,简称快速grep命令,其实和grep -F等价,不支持正则表达式,按照字符串表面意思进行匹配.
1.2 使用grep
1.2.1 grep命令格式
grep [option] pattern file
1.2.2 命令功能
功能描述:在文件中搜寻字串匹配的行并输出
1.2.3 命令参数
-i 搜索时,忽略大小写
-c 只输出匹配行的数量
-l 只列出符合匹配的文件名,不列出具体的匹配行
-n 列出所有的匹配行,显示行号
-h 查询多文件时不显示文件名
-s 不显示不存在、没有匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-w 匹配整词
-x 匹配整行
-r 递归搜索
-q 禁止输出任何结果,已退出状态表示搜索是否成功
-b 打印匹配行距文件头部的偏移量,以字节为单位
-o 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
-e 实现多个选项间的逻辑or关系
-E 扩展的正则表达式
1.3 grep范例
2、sed
2.1 什么是sed
sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed 主要是用来将数据进行选取、替换、删除、新增的命令。
2.2 使用sed
2.2.1 sed命令格式
sed [选项] ‘动作’ 文件名
2.2.2 命令功能
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
2.2.3 命令参数
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条 sed 命令编辑
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-r:支持扩展的正则表达式
-i:直接将处理的结果写入文件
-i.bak:在将处理的结果写入文件之前备份一份
动作:
a\:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\” 代表数据未完结。
c\:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾“\”代表数据未完结。
i\:插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要"\"代表数据未完结。
d:删除,删除指定的行。
p:打印,输出指定的行。
s:字串替换,用一个字符串替换另外一个字符串。格式为“行范 围 s/旧字串/新字串/g”(和vim中的替换格式类似)
2.3 sed范例
vim student.txt(注意中间不是空格 是制表符也就是Tab键)
ID Name English Chinese Science Average
1 Bob 87 95 86 85.6
2 Lily 75 86 87 89.6
3 Jack 99 88 88 90.6
接下来我们将用这个示例文件对sed命令进行演示
sed '2p' student.txt (会发现不只输出了第二行,还有文件内容本身)
ID Name English Chinese Science Average
1 Bob 87 95 86 85.6
1 Bob 87 95 86 85.6
2 Lily 75 86 87 89.6
3 Jack 99 88 88 90.6
sed -n '2p' student.txt (下面我们加入-n参数发现只输出了第二行)
1 Bob 87 95 86 85.6
sed '2,4d' student.txt (删除2-4行,但不修改数据本身)
ID Name English Chinese Science Average
sed '2a hello' student.txt (在第二行后追加hello)
ID Name English Chinese Science Average
1 Bob 87 95 86 85.6
hello
2 Lily 75 86 87 89.6
3 Jack 99 88 88 90.6
sed '2i hello' student.txt (在第二行前追加hello)
ID Name English Chinese Science Average
hello
1 Bob 87 95 86 85.6
2 Lily 75 86 87 89.6
3 Jack 99 88 88 90.6
sed '2c no such person' student.txt(第二行替换)
ID Name English Chinese Science Average
no such person
2 Lily 75 86 87 89.6
3 Jack 99 88 88 90.6
字符串替换格式
sed ‘s/旧字串/新字串/g’ 文件名
sed '3s/75/99/g' student.txt (将75换成99)
ID Name English Chinese Science Average
1 Bob 87 95 86 85.6
2 Lily 99 86 87 89.6
3 Jack 99 88 88 90.6
sed -e 's/Bob//g;s/Lily//g' student.txt (将Bob和Lily换成空)
ID Name English Chinese Science Average
1 87 95 86 85.6
2 75 86 87 89.6
3 Jack 99 88 88 90.6
sed -i '3s/77/99/g' student.txt
sed 操作的数据直接写入文件,相当于把修改的内容保存到文件
3、awk(非常基本介绍)
3.1 什么是awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(就是键盘输入)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用,灵活性是awk最大的优势。
awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
3.2 使用awk
3.2.1 命令格式
awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名
3.2.2 命令参数
条件(Pattern)
一般使用关系表达式作为条件
x>10判断变量x是否大于10
x>=10 大于等于 x<=10 小于等于
动作(Action)
格式化输出
流程控制语句
3.3 awk范例
咱们的示例数据还是sed命令那时候的student.txt
awk '{print $2 "\t" $6 "\n"}' student.txt (提取第二列和第六列,“\t”制表符,“\n”换行符)
Name Average
Bob 85.6
Lily 89.6
Jack 90.6
df -h|awk '{print $1 "\t" $3 "\t" $5}'(df命令显示磁盘空间使用情况)
文件系统 已用 已用%
tmpfs 2.0M 1%
/dev/sda3 25G 91%
tmpfs 0 0%
tmpfs 4.0K 1%
/dev/sda2 5.3M 2%
/dev/sdb5 24K 1%
/dev/sdb1 24K 1%
tmpfs 1.3M 1%
/dev/sr0 3.0G 100%
这个时候我们想要提取sda3这一行,已用这一列的数字(不包含%)
df -h|grep sda3|awk '{print $5}'
91%
df -h| grep sda3 | awk '{print $5}' |cut -d "%" -f 1
91
#cut命令切割
-d 自定义分隔符,默认为制表符”TAB”
-f 显示指定字段的内容 , 与-d一起使用
BEGIN/END 模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{} :仅在文本处理完成之后执行
awk 'BEGIN{printf "This is a transcript \n" } {printf $2 "\t" $6 "\n"}' student.txt
This is a transcript
Name Average
Bob 85.6
Lily 89.6
Jack 90.6
awk 'END{printf "The End \n" }
{printf $2 "\t" $6 "\n"}' student.txt
Name Average
Bob 85.6
Lily 89.6
Jack 90.6
The End
#同学们应该发现awk命令里面我有的时候用print有的时候用printf,其实printf命令更强大,比较复杂。print属于awk自带的,可以让我们不需要打换行符,自动换行
FS 内置变量:输入字段分隔符,默认为空白字符
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
root 0
sjadsqf 1000
需要咱们指定分隔符,因为/etc/passwd文件分隔符为“:”,所以需要我们指定分隔符
关系运算符
cat student.txt | grep -v Name | awk '$6 >= 87{printf $2 "\n"}'
Lily
Jack
4、wc
4.1 什么是wc
wc命令统计指定文件中的字节数、字数、行数,并将统计结果显示输出
4.2 命令参数
统计命令 wc
wc [选项] 文件名
选项:
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
关于grep、sed、awk命令介绍的比较基础,还需要大家继续不断学习,希望对大家有所帮助
今天就到这里啦!
获取更多信息
喜欢本文就给我点个赞吧!
往期回顾