文本编辑三剑客之awk

本文详细介绍了awk的文本过滤、流编辑、作者名字首字母的组合报告生成、特定信息抽取及格式化输出等核心功能,包括grep、sed、print、awk变量、printf输出重定向、操作符、模式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep:文本过滤器

grep ‘pattern’ input_file


sed:流编辑器

sed ‘COMMAND/PATTERN/[修饰符]’


awk:作者名字首字母的组合,报告生成器,抽取特定信息并格式化输出

awk [options] ‘PATTERN {action}’ file1, file2 …


-F: 以冒号为分隔符;


awk的输出:

一、print

print的使用格式

print item1, item2,…

要点:

1、各项目之间使用逗号隔开,而输出时则以空白字符分隔;

2、输出的item可以为字符串或者数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后在输出;

3、print命令后的item可以省略,此时功能相当于print $0,因此,如果想输出空白行需要使用print “”;


例子:

awk ‘BEGIN { print “line one\nline two\nline three”}’

awk -F: ‘{print $1, $3}’/etc/passwd


二、awk变量

2.1、awk内置变量之记录变量

FS:filed separator,读取文本时所使用的字段分隔符

RS:record separator,读取文本时所使用的换行符

OFS:output Filed separator;

ORS:output Row Separator;


2.2、awk内置变量之数据变量

NR:the number of input records, awk命令所处理的记录数,如果有多个文件,这个数目会基于所有已处理文件的;

NF:number of filed,当前记录的filed个数;

FNR:与NR不同的是,FNR用于记录行是基于当前处理文件的

ARGV:数组,保存命令行本身这个字符串,如awk ‘{print $0}’ a.txt b.txt这个命令中,ARGV[0]保存awk, ARGV[1]保存a.txt

ARGC:awk命令的参数的个数

FILENAME:awk命令所处理的文件的名称

ENVIRON:当前shell环境变量及其值得关联数组


如 awk ‘BEGIN {print ENVIRON[“PATH”]}’


2.3、用户自定义变量

gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母数字下划线,且不能以数字开头,

gawk变量名称区分字符大小写。

2.3.1在脚本中赋值变量

在gawk中给变量赋值使用赋值语句进行,如awk  ‘BEGIN{ var = “variable testing”; print var}’//语句之间用分号隔开

2.3.2在命令行中使用赋值变量

gawk命令中也可以在“脚本”外给变量赋值,并在脚本中进行引用,如 awk -v var=“variable testing” ‘BEGIN {print var}’


三、printf

printf命令的使用格式:

printf format, item1, item2,…


要点:

1、其与print命令的最大的不同是,printf需要指定format;

2、format用于指定后面的每个item的输出格式;

3、printf语句不会自动打印换行符


format格式的指示符都以%开头,后跟一个字符,如下:

%c:显示字符的ASCII码;

%d,%i:十进制整数;

%e,%E:科学计数法显示数值;

%f:显示浮点数;

%g,%G:以科学计数法的格式或浮点数的格式显示数值;

%s:显示字符串;

%u:无符号整数;

修饰符:

N:显示宽度;

-:左对齐;

+:显示数值符号;



四、输出重定向


print items > output-file

print items >> output-file

print items | command 


特殊文件描述符:

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

/dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;



五、awk的操作符:

-x:负值;

+x:转换为数值;

x^y:

x**y:次方

x/y:除法

x+y:

x-y:

x%y:


字符串操作符:

只有一个,而且不用写出来,用于实现字符串连接;


负值操作符:

=

+=

-=

*=

/=

%=

^=

**=

++

需要注意的是,如果某模式为=,此时使用/=/可能会有语法错误,应以/[=]/替代;


布尔值

awk中,任何非0值或者非空字符串都为真,反之就为假;


比较操作符:

x < y

x <= y

x > y

x >= y

x == y

x != y

x ~ y true if the string x matches the regexp denoted by y

x !~ y

subscript in array  true if the array  array has an element with the subscript  subjscript.


表达式之间的逻辑关系运算符

&&

||


条件表达式

selector? if-true-exp:if-false-exp


函数调用:

function_name (para1, para2)



六、awk的模式

awk ‘program’ input-file1, input-file2 …

其中的program 为 

pattern { action}

pattern {action}

……


6.1、常见的模式类型:

1、regexp:正则表达式,格式为/regexp/

2、expression:表达式,其值非0或者非空字符串时满足条件, 如: $1 ~/foo/ 或 $1 == “hello”,用匹配运算符~或者不匹配运算符!~

3、ranges:指定的匹配返回,格式为pat1,pat2

4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或者结束前运行一次

5、empty(空模式):{之前未指明任何模式,匹配任意输入行;


6.2、常见的{action}:

1、{expression}:

2、{control statements}:

3、{compound statements}:

4、{input statements}:

5、{output statements}:


/正则表达式/:使用通配符的拓展集

关系表达式:可以用下面运算表中的关系运算符进行操作,可以是字符串或者数字的比较,如$2>$1选择第二个字段比第一个字段长的行

模式匹配表达式:

模式,模式:指定一个行的范围,该语法不能包括BEGIN和END模式

BEGIN:让用户指定在第一条记录被处理之前所发生的动作,通常可以在这里设置全局变量

END:让用户在最后一条输入进记录被读取之后发生的动作。


 


七、控制语句

7.1、if-else

语法:if (condition){then-body} else {[else-body]};

awk -F: ‘{if ($1 == “root”) print $1, “admin”;else print $1, “common user”}’ /etc/passwd

7.2、while:循环的是字段而不是行

语法:while (condition){statement1; statement2;…}

awk -F: ‘{i = 1; while(i <= 3) {print $i; i++}}’ /etc/passwd

7.3、do-while

语法:do{statement1,statement2, …} while(condition)

awk -F: ‘{i = 1; do {print $i; i++} while(i <= 3)}’ /etc/passwd

7.4、for

语法:for(variable assignment; condition; iteration process){statement1, statement2,…}

awk -F: ‘{for(i = 1; i <= 3; i++) print $i}’ /etc/passwd

for循环还可以用来遍历数组元素

语法:for (i in array){statement1、 statement2, …}

awk -F: ‘$NF!~/^$/{BASH[$NF]++} END{for A in BASH){printf “%15s:%i\n”, A, BASH[A]}}’ /etc/passwd

7.5 case

语法:switch(expression) {case VALUE or /REGeXP/: statement1, statement2, … default: statement1, …}

7.6 break和continue

常用于循环或者case语句中

7.7next(相当于awk内部的continue)

提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:

awk -F: ‘{if ($3%2 == 0) next; print $1, $3}’/etc/passwd



 八、awk中使用的数组


8.1数组:注意,下标从1开始计数!可以直接使用不用事先声明。

array[index-expression]

index-expression可以使用任意字符串;需要注意的是,如果某数组元素事先不存在,那么在引用的时候,awk会自动创建此元素并初始化为空串;因此,要判断某数组中是否存在某元素,需要使用index in array的方式

要遍历数组中的每一个元素,需要使用如下的特殊结构:for (var in array){statement1, statement2,…},其中var用于引用数组下表,而不是元素值;

如:

netstat -ant | awk ‘/^tcp/ {++S[$NF]} END { for(a in S) print a, S[a]}’


8.2删除数组变量

从关系数组中删除数组索引需要使用delete命令,使用格式为:

delete array[index]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值