linux三剑客有什么区别,学习Linux三剑客

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

分隔符

分隔符分为输入分隔符、输出分隔符

输入分隔符默认以空白字符对每一行进行分割

输出分隔符默认以空白字符作为输出到屏幕上

输入分隔符

61bad2c092404799e8e959ae4e9c2e19.png

f2c559e1897081220314bc373d09472c.png

方法1,如图所示,awk通过-F指定你所需要的输入分割符。

方法2,可使用内置变量FS,指定,并配合-v

awk -v FS="@" '{print $1,$2}' text.txt

输出分隔符

输出分隔符通过内置变量OFS指定,并配合-v,

e79fe529e371b134808d25a396f3ccf2.png

如果你不想使用分隔符的话,需要改为'{print $1 $2}',区别在于,表示输出是否需要分隔。

变量

常用内置变量

FS:输入分隔符,默认空白字符

OFS:输出分隔符,默认空白字符

RS:输入记录分隔符(输入换行符),指定输入时的换行符

ORS:输出记录分隔符(输出换行符),指定输出时的换行符

NF:当前行的字段的个数(当前行被分隔了几个)

NR:行号,当前处理文本的行号

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令后参数的个数

ARGV:数组,保存的事命令行所给定的各参数

RS

awk默认换行符为行分隔符,如果你需要别的,可以使用RS来指定,举例子

96a28387af4cf7dabb8c4f1d117df285.png

52144ce5a719e4b6a56d7961a20e25e5.png

ORS

同理

d41f1c014be0c894bc445ac5242d5d13.png

FILENAME

显示文件名

f1e6550a34ad97af5a54728524510aea.png

ARGC、ARGV

如图

d5090460f3c3ecdfe69ff8ce745938c5.png

自定义变量

-v var=value直接定义

在{action}中定义,使用;区分变量与动作

格式化

在'{action}'使用printf进行格式化,举例

fbb344a4b48e72cc84c5d77e0f4887a9.png

需要注意的点

使用printf格式化输出不会换行,需要\n

使用printf格式化输出,需要用,隔开指定格式与被格式化文本

使用printf格式化输出,指定格式的个数需要与文本参数个数对应

Pattern

定义

Pattern为给定条件,满足该条件,awk对该行进行处理,反之则不处理。

类型

空模式

关系运算模式

正则模式

行范围模式

BEGIN/END模式

简单举例

5bb864ae67880ea2af823cd2812593f8.png

02a8ef6cda1fbad9a141ff067c2f5de2.png

例子为满足被分隔数>4的行才输出

关系运算符

<

<=

==

!=

>=

>

~,和对应的正则匹配为真

!~,和对应的正则不匹配为真

正则模式

用法:awk中的正则需要放入/正则/中,举例

06dbec10f9ce54cc8ccf52febf74f22f.png

需要注意的地方

/需要\转义

对于范围正则如/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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值