Linux三剑客
grep、sed、awk被称为Linux中的“三剑客”
作用
grep适合单纯的查找或匹配文本
sec适合编辑匹配到的文本
awk适合格式化文本,对文本进行复杂的处理,并输出
awk
定义
awk用于文本格式化并生成你所需要的报告
基础
awk的主要语法格式为`awk [optiongs] 'Pattern{Action}' file
awk是逐行处理的,默认以换行符为标记处理每一行
awk中最常用的动作为print和 printf,例如awk '{print}' test.txt
awk中以$n表示将输出当前行按分隔符分割后的第n列。默认分隔符为空格。
$0表示整行, $NF表示最后一列,NF表示当前行被分隔符切开后有几个字段。
简单例子
awk '{print $1,$2}' test.txt
awk '{print "test:"$1, "test:"$2}' test.txt
分隔符
分隔符分为输入分隔符、输出分隔符
输入分隔符默认以空白字符对每一行进行分割
输出分隔符默认以空白字符作为输出到屏幕上
输入分隔符
方法1,如图所示,awk通过-F指定你所需要的输入分割符。
方法2,可使用内置变量FS,指定,并配合-v
awk -v FS="@" '{print $1,$2}' text.txt
输出分隔符
输出分隔符通过内置变量OFS指定,并配合-v,
如果你不想使用分隔符的话,需要改为'{print $1 $2}',区别在于,表示输出是否需要分隔。
变量
常用内置变量
FS:输入分隔符,默认空白字符
OFS:输出分隔符,默认空白字符
RS:输入记录分隔符(输入换行符),指定输入时的换行符
ORS:输出记录分隔符(输出换行符),指定输出时的换行符
NF:当前行的字段的个数(当前行被分隔了几个)
NR:行号,当前处理文本的行号
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令后参数的个数
ARGV:数组,保存的事命令行所给定的各参数
RS
awk默认换行符为行分隔符,如果你需要别的,可以使用RS来指定,举例子
ORS
同理
FILENAME
显示文件名
ARGC、ARGV
如图
自定义变量
-v var=value直接定义
在{action}中定义,使用;区分变量与动作
格式化
在'{action}'使用printf进行格式化,举例
需要注意的点
使用printf格式化输出不会换行,需要\n
使用printf格式化输出,需要用,隔开指定格式与被格式化文本
使用printf格式化输出,指定格式的个数需要与文本参数个数对应
Pattern
定义
Pattern为给定条件,满足该条件,awk对该行进行处理,反之则不处理。
类型
空模式
关系运算模式
正则模式
行范围模式
BEGIN/END模式
简单举例
例子为满足被分隔数>4的行才输出
关系运算符
<
<=
==
!=
>=
>
~,和对应的正则匹配为真
!~,和对应的正则不匹配为真
正则模式
用法:awk中的正则需要放入/正则/中,举例
需要注意的地方
/需要\转义
对于范围正则如/aa{2,3}/(aa最少出现2次,最多出现3次)时,需要在前面加--posix,--re-interval
行范围模式
定义
正则类型awk '/正则1/,/正则2/{action}' file
普通类型awk '条件1 关系运算符 条件2{action}' file
描述
从正则1匹配到的行开始,到正则2匹配到的行结束,之间所有匹配到的行都会执行该动作。
从条件1匹配到的行开始,到条件2匹配到的行结束,之间所有匹配到的行都会执行该动作。
Action
类型
if
if...else
for
while
举例
if awk '{if(NR==1){print $0}} text.txt'
if...else awk '{if(NR==1){print $1,"test1"}else{print $1,"test2"}} text.txt'
三元运算
描述
条件 ? 结果1: 结果2
条件为真,则结果1,反之结果2
举例
awk '{var=$3<100"test1":"test2";print $1, var}' test.txt'
grep
描述
可以用正则表达式进行全局搜索的命令
参数
-i :不区分大小写
-n :打印行号
--color:高亮关键字
-c:打印匹配到的总行数
-o:只显示匹配到的内容
-Bx:显示匹配到的行的之前x行
-Ax:显示匹配到的行的之后x行
-Cx:显示匹配到的行的前后x行
-w:精确匹配,完全匹配
-v:不包含关键字的行
-e:或
-q:静默模式,无返回,需要配合echo $? 使用,返回0表示匹配到了
-E:正则
sed
描述
一次处理一行内容,但本身不会对文件生效,可重定向存储来保存
参数
-n:经过sed处理的行才输出屏幕
-e:或
-r:支持扩展正则
动作
xa :第x行后新增,a后字符串为新增的行
c :取代,c后字符串为取代的字符串
d :删除
i :插入, i 的后面可以接字串
p :打印
s :取代,配合正则使用
q:退出
g:全局,范围是每一行,也就是说是一行为单位,作为一个全局
主要用途
数据搜寻并显示
nl /etc/passwd | sed '/root/p'
复制代码
数据的搜寻并删除
nl /etc/passwd | sed '/root/d'
复制代码
数据的搜寻并执行命令
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
复制代码
数据的搜寻并替换
sed 's/要被取代的字串/新的字串/g'
复制代码
多条件
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
复制代码
直接修改文件内容(危险动作)
sed -i 's/\.$/\!/g' text.txt
复制代码
修改后重定向(安全)
sed 's/test1/test2/g' test1.txt > test2.txt