学习Linux三剑客

497 阅读1分钟

Linux三剑客

grep、sed、awk被称为Linux中的“三剑客”

作用

  • grep适合单纯的查找或匹配文本
  • sec适合编辑匹配到的文本
  • awk适合格式化文本,对文本进行复杂的处理,并输出

awk

定义

awk用于文本格式化并生成你所需要的报告

基础

awk的主要语法格式为`awk [optiongs] 'Pattern{Action}' file

awk是逐行处理的,默认以换行符为标记处理每一行

awk中最常用的动作为printprintf,例如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

如图

自定义变量
  1. -v var=value直接定义

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

格式化

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

需要注意的点

  1. 使用printf格式化输出不会换行,需要\n
  2. 使用printf格式化输出,需要用,隔开指定格式与被格式化文本
  3. 使用printf格式化输出,指定格式的个数需要与文本参数个数对应

Pattern

定义

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

类型
  • 空模式
  • 关系运算模式
  • 正则模式
  • 行范围模式
  • BEGIN/END模式
简单举例

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

关系运算符

  • <

  • <=

  • ==

  • !=

  • >=

  • >

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

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

正则模式

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

需要注意的地方

  1. /需要\转义
  2. 对于范围正则如/aa{2,3}/(aa最少出现2次,最多出现3次)时,需要在前面加--posix--re-interval
行范围模式
定义
  1. 正则类型awk '/正则1/,/正则2/{action}' file

  2. 普通类型awk '条件1 关系运算符 条件2{action}' file

描述
  1. 从正则1匹配到的行开始,到正则2匹配到的行结束,之间所有匹配到的行都会执行该动作。
  2. 从条件1匹配到的行开始,到条件2匹配到的行结束,之间所有匹配到的行都会执行该动作。

Action

类型
  1. if
  2. if...else
  3. for
  4. while
举例
  1. if awk '{if(NR==1){print $0}} text.txt'
  2. 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