概念
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。
grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
1.grep
grep是linux中一种文本搜索工具,他有以下特点:
- 使用正则表达式搜索文本
- 匹配到的文本会显示出来并标红
- 使用权限是所有用户
工作原理
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep=grep-E:扩展的正则表达式(除了**<,>,\b**使用其他正则都可以去掉\)
1.1grep的命令格式
grep命令参数要查询的文件名
1.2命令参数
- -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
- -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -c:统计匹配的行数
- -e:实现多个选项间的逻辑or关系
- -E:扩展的正则表达式
- -fFILE:从FILE获取PATTERN匹配
- -F:相当于fgrep
- -i--ignore-case#忽略字符大小写的差别。
- -n:显示匹配的行号
- -o:仅显示匹配到的字符串
- -q:静默模式,不输出任何信息
- -s:不显示错误信息。
- -v:显示不被pattern匹配到的行,相当于[^]反向匹配
- -w:匹配整个单词
1.2.1-A-B-C/-c-o
首先先看我们的文本内容:
我们首先使用A来查询
可见我们的ABC参数的基本命令格式为:
grepA/B/C要显示的行数要查询的关键字要查询文件名
-o仅显示匹配到的字符串
小写c的作用是返回匹配到的行数
例如:
这里的意思就是test文件中有两行存在a这个字符
1.2.2-e/-E
-e的作用是实现多个选项间的逻辑or
它的作用实际上就是或(把要求的两种都输出出来)
如果另一个条件是不存在的,那么就只输出满足条件的
-E:扩展的正则表达式
对于正则表达式的部分会在下面描述。
1.2.3-fFILE
-fFILE:从FILE获取PATTERN匹配
例如:
相当于把其他文件的内容作为标准进行匹配
当然多个匹配也是可以的
1.2.4-n-i
- -i--ignore-case#忽略字符大小写的差别。
- -n:显示匹配的行号
例如:
这里呢就是忽略大小写,然后输出a/A再显示出他们的行号
1.2.5--q-s-v-w
-q叫静默模式也就是啥也不输出(无论是存在还是不存在)
-v:显示不被pattern匹配到的行,相当于[^]反向匹配
-w:匹配整个单词(精准匹配)
2.正则表达式
关于正则表达式的基本知识点总结我放在下面这个博客中,这里只写出我们现在需要的部分:
正则表达式:https://blog.csdn.net/qq_41819426/article/details/121705830?spm=1001.2014.3001.5501.
2.1匹配字符
- .匹配任意单个字符,不能匹配空行
- []匹配指定范围内的任意单个字符
- [^]取反
- [:alnum:]或[0-9a-zA-Z]
- [:alpha:]或[a-zA-Z]
- [:upper:]或[A-Z]
- [:lower:]或[a-z]
- [:blank:]空白字符(空格和制表符)
- [:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
- [:cntrl:]不可打印的控制字符(退格、删除、警铃…)
- [:digit:]十进制数字或[0-9]
- [:xdigit:]十六进制数字
- [:graph:]可打印的非空白字符
- [:print:]可打印字符
- [:punct:]标点符号
2.1.1.[][^]
.就是匹配任意字符
[]匹配指定范围内的任意单个字符
[^]取反
2.1.2[:alnum:][:alpha:][:upper:][:lower:][:digit:]
- [:alnum:]或[0-9a-zA-Z]匹配任意大小写英文以及数字
- [:alpha:]或[a-zA-Z]匹配任意大小写英文
- [:upper:]或[A-Z]匹配大写英文
- [:lower:]或[a-z]匹配小写英文
- [:digit:]十进制数字或[0-9]匹配任意数字
2.1.3-[:blank:][:space:][:cntrl:]
- [:blank:]空白字符(空格和制表符)
- [:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
- [:cntrl:]不可打印的控制字符(退格、删除、警铃…)
- 注:空格、制表符、换行符(创建新行)、回车符、换页符、垂直制表符称为“空白字符”
2.1.4[:graph:][:print:]
- [:graph:]可打印的非空白字符
- [:print:]可打印字符
2.2正则表达式的匹配次数
- 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
- .*任意前面长度的任意字符,不包括0次
- ?匹配其前面的字符0或1次
- 匹配其前面的字符至少1次
- {n}匹配前面的字符n次
- {m,n}匹配前面的字符至少m次,至多n次
- {,n}匹配前面的字符至多n次
- {n,}匹配前面的字符至少n次
2.3位置锚点
^行首锚定,用于模式的最左侧
$行尾锚定,用于模式的最右侧
^PATTERN$,用于模式匹配整行
^$空行
空白行<或\b词首锚定,用于单词模式的左侧
>或\b词尾锚定;用于单词模式的右侧
2.4分组和后向引用**
(1)格式
①分组:()将一个或多个字符捆绑在一起,当作一个整体进行处理
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,…
②后向引用
引用前面的分组括号中的模式所匹配字符,而非模式本身
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\2表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
&表示前面的分组中所有字符
③流程分析如下:
例如:
3.sed
sed是一种流编辑器,他有如下特点
- 一次处理一行的内容
- 处理时,会产生一个“模式空间”(临时缓冲区),然后用sed命令处理缓冲区内容,再把缓冲区内容呈现在屏幕上。
- 如果没有其他指令,sed命令将会在两个模式空间内来回循环,但是不会清空保留空间。
- 整个过程原文件是没有变化的(除非使用了重定向输出或者-i指令)
3.1常用选项
- -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
- **-e:**多点编辑,对每行处理时,可以有多个Script
- -f:把Script写到文件当中,在执行sed时-f指定文件路径,如果是多个Script,换行写
- -r:支持扩展的正则表达式
- -i:直接将处理的结果写入文件
- -i.bak:在将处理的结果写入文件之前备份一份
①不加选项和-n
在不加选项的情况下,sed命令会首先打印一遍要查找的内容,然后再把所有行再打印一遍
而-n命令将只会打印匹配到的行
②-e多点编辑-f执行指定文件路径
-e就是用来同时输入多个sed指令使用的
sed-e"s/a/A/"-e"/s/b/B/"test1//等价于sed"s/a/A/"test1sed"s/b/B/"test1
-f也可以同时执行多个命令,写命令时分行即可
3.2地界
- 不给地址:对全文进行处理
- 单地址:
- #:指定的行
- /pattern/:被此处模式所能够匹配到的每一行
- 地址范围:
- #,#
- #,#
- /pat1/,/pat2/
- #,/pat1/
- ~:步进
- sed-n‘1~2p’只打印奇数行(1~2从第1行,一次加2行)
- sed-n‘2~2p’只打印偶数行
①通常用法
在上述语句中sed-n"p"test2是不指定行,将所有都打印出来sed"s/a/A/g"test2则是将test2文件中的第一行中的所有a替换成A
sed-n"/aaa/ptest2打印存在aaa字段的行sed-n"1,2p"test2打印1-2行
sed-n"2,/CC/p"test2打印2到存在CC的行sed"1~2s/[aC]/E/g"test2将奇数行中的a或C替换成E
3.3编辑命令
d:删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a:在指定行后面追加文本,支持使用\n实现多行追加
i:在行前面插入文本,支持使用\n实现多行追加
c:替换行为单行或多行文本,支持使用\n实现多行追加
w:保存模式匹配的行至指定文件
r:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
- 加g表示行内全局替换;
- 在替换时,可以加一下命令,实现大小写转换
- \l:把下个字符转换成小写。
- \L:把replacement字母转换成小写,直到\U或\E出现。
- \u:把下个字符转换成大写。
- \U:把replacement字母转换成大写,直到\L或\E出现。
- \E:停止以\L或\U开始的大小写转换
①常用用法:
sed"3d"test2删除第三行sed-n"2p"test2打印第二行sed"3a123\n4a123"test2在第三行后追加123{通过\n连接}在第四行后追加123
sed"2i123"test2在第二行前面追加123sed"3c123"test2把第三行替换成123sed-n"3w/root/test.sed/test3"test2把test2中的第三行内容保存到test3中
sed"1r/root/test,sed/test3"test2把test3中的内容放在test2的第一行后sed-n"="test2打印行号sed-n"2!p"test2打印除了第二行的内容
4.awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.
它有如下特点:
- 数据可以有多方面来源:输入,其他文件(1个或者多个),其他命令
- 支持自定义函数
- 多作为脚本使用,有非常多的内建功能
4.1awk基础
4.1.1awk的语法
awk[options]file...
4.1.2awk常见选项
- -Ffs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
- -vvar=value:赋值一个用户定义变量,将外部变量传递给awk
- -fscripfile:从脚本文件中读取awk命令
4.2awk变量
分为内置变量和自定义变量,由-v开头
4.2.1内置变量
- FS:输入字段分隔符,默认为空白字符
- OFS:输出字段分隔符,默认为空白字符
- RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
- ORS:输出记录分隔符,输出时用指定符号代替换行符
- NF:字段数量,共有多少字段,NF引用最后一列,NF引用最后一列,NF引用最后一列,(NF-1)引用倒数第2列
- NR:行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
- FNR:各文件分别计数,行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
- FILENAME:当前文件名
- ARGC:命令行参数的个数
- ARGV:数组,保存的是命令行所给定的各参数,查看参数
①基本用法
awk-vFS=':'‘{print$1,$2}’test1FS指定输入分隔符awk-vFS=':'-vOFS='@@@''{print$1,$2}'test1OFS指定输出分隔符(把指定内容作为分隔符)awk-vRS=':''{print$1,$2}'test1RS把指定内容作为换行符
注意:{print$1}就是将某一行(一条记录)中分割符前的第一个字段打印出来
awk-F:'{printNF}'test1NF的作用是输出字段数量,$NF可以用作引用最后一列awk-F:'{print$(NF-1)}'test1$NF-1可以用作引用倒数第二列以此类推
awk'{printNR}'test1test2NR的作用是输出行号,可以在后面追加文件来追加行号awkEND'{printNR}'test1test2END输出最后一位的行号awk'{printFNR}'test1test2各文件分别计数行号
awk'{printFILENAME}'test1filename指定当前文件名作为输入变量awk'BEGIN{printARGC}'test1test2**命令行参数**的个数
4.3print
(1)格式化输出
printf``"FORMAT"``,item1,item2,...
①必须指定FORMAT
②不会自动换行,需要显式给出换行控制符,\n
③FORMAT中需要分别为后面每个item指定格式符
(2)格式符:与item一个一个地对应
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:显示科学计数法数值
%f:显示
为浮点数,小数%5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示
%u:无符号整数
%%:显示%自身
(3)修饰符:放在%c[/d/e/f…]之间
- #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%5.1f
- -:左对齐(默认右对齐)%-15s
- :显示数值的正负符号%d
这里做的时候虚拟机崩溃了,就没有图片了
[root@along~]#awk-F:'{print$1,$3}'/etc/passwdroot0bin1---第一列显示小于20的字符串;第2列显示整数并换行[root@along~]#awk-F:'{printf"s---%u\n",$1,$3}'/etc/passwdroot---0bin---1---使用-进行左对齐;第2列显示浮点数[root@along~]#awk-F:'{printf"%-20s---%-10.3f\n",$1,$3}'/etc/passwdroot---0.000bin---1.000---使用printf做表格[root@along~]#awk-F:'BEGIN{printf"usernameuserid\n-----------------------------\n"}{printf"%-20s|%-10.3f\n",$1,$3}'/etc/passwdusernameuserid-----------------------------root|0.000bin|1.000
4.4格式运算符
算术操作符:
- xy,x-y,x*y,x/y,x^y,x%y
- -x:转换为负数
- x:转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
- =,=,-=,*=,/=,%=,^=
- ,–
比较操作符:
- ==,!=,>,>=,<,<=
模式匹配符:~:左边是否和右边匹配包含!~:是否不匹配
逻辑操作符:与&&,或||,非!
函数调用:function_name(argu1,argu2,…)
条件表达式(三目表达式):
selector
?
if-true-expression
:
if-false-expression
- 注释:先判断selector,如果符合执行?后的操作;否则执行:后的操作
(1)模式匹配符
df-h|awk-F:'$0~/^\/dev/'---查询以/dev开头的磁盘信息df-h|awk'$0~/^\/dev/{print$(NF-1)"---"$1}'---只显示磁盘使用状况和磁盘名
(2)逻辑操作符
这里的操作就是将第三个分隔符前数字大于0小于1000的第一个分隔符前和第三个分隔符前的数据打印出来
(3)条件表达式(三目表达式)- 注释:先判断selector,如果符合执行?后的操作;否则执行:后的操作
awk-F:'{$3>=1000?usertype="commonuser":usertype="sysadminuser";printusertype,$1,$3}'/etc/passwd
4.5awkPATTERN匹配部分
PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2)/regularexpression/:仅处理能够模式匹配到的行,正则,需要用//括起来
(3)relationalexpression:关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
(4)lineranges:行范围
startline(起始行),endline(结束行):/pat1/,/pat2/不支持直接给出数字,可以有多段,中间可以有间隔
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行
[root@along~]#awk-F:'{print$1}'awkdemohellolinuxalong[root@along~]#awk-F:'/along/{print$1}'awkdemoalong[root@along~]#awk-F:'1{print$1}'awkdemohellolinuxalong[root@along~]#awk-F:'0{print$1}'awkdemo[root@along~]#awk-F:'/^h/,/^a/{print$1}'awkdemohellolinuxalong[root@along~]#awk-F:'BEGIN{print"第一列"}{print$1}END{print"结束"}'awkdemo第一列hellolinuxalong结束