vlambda博客
学习文章列表

Linux-grep、sed、awk命令基本操作

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范例

Linux-grep、sed、awk命令基本操作
最基本用法grep+想要搜索的东西+文件名
Linux-grep、sed、awk命令基本操作
去除以#开头的所有行信息,^表示以 XXX 开头

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(Linux-grep、sed、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命令介绍的比较基础,还需要大家继续不断学习,希望对大家有所帮助

Linux-grep、sed、awk命令基本操作

今天就到这里啦!

Linux-grep、sed、awk命令基本操作

Linux-grep、sed、awk命令基本操作


Linux-grep、sed、awk命令基本操作

获取更多信息

喜欢本文就给我点个赞吧!

往期回顾