awk

本文详细介绍了awk命令的基本用法及高级应用,包括变量设置、格式化输出、条件判断等内容,并通过实例展示了如何利用awk进行文本处理。

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

awk:报告生成器,格式化文本输出工具
我们平时在系统上用的awk为gawk
这里写图片描述
gawk:

    基本用法:gawk [ options ] 'program' file ...
        program:PATTERN{ACTION STATEMENTS}  语句之间用分隔符
        print, printf

        选项:
        -F:指明输入时用到的字段分隔符
        -v var=value:自定义变量

awk处理文本的方式:从对应文件中一次读取一行,根据输入分隔符进行切片,把每一个片都保存在awk内建的位置变量中($1,$2,$3,$4……)。$0则表示一整行。

  • 1、print

    print item1, item2, ...
    要点:
        (1)以逗号为分隔符;
        (2)输出的各item可以是字符串。,也可以是数值,也可以是记录的字段,变量或awk的表达式;
        (3)如省略item,相当于print $0;
    

可以看到命令行中每个item以逗号为分隔符,但是在显示结果时默认以空格为分隔符
这里写图片描述

  • 2、变量

    2.1 内建变量
        FS:input filed seperator,默认为空白字符
        OFS:output filed seperator,默认为空白字符
    

    这里写图片描述

        RS:input record seperator,输入时的换行符
        ORS:output record seperator ,输出时的换行符
        NF: 字段数量
    

    注意区分{print NF}和{print $NF}
    这里写图片描述
    这里写图片描述

    NR:行数
    FNR:各文件分别计数,行数
    

    这里写图片描述
    如果是多个文件,则下一个文件接着前一个文件继续计数
    这里写图片描述

这里写图片描述

FILENAME:当前文件名

这里写图片描述

ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给的各参数。

这里写图片描述
可以看到由于awk的工作机制决定,每读入一行就会将结果输出一遍,如果我们想只输出一遍,则可以使用BEGIN模式
这里写图片描述

2.2自定义变量
(1)-v var=value    变量名区分大小写

这里写图片描述
这里写图片描述

(2)在program中直接定义

注意在某些版本中,定义变量要使用双引号““,否则会报错
这里写图片描述
这里写图片描述

  • 3、printf ,格式化输出
    printf FORMAT, item1, item2, …
    (1)FORMAT必须给出
    (2)不会自动换行,需要显示给出自动换行控制符,\n
    (3)FORMAT中需要分别为后面的每一个item指定一个格式化符号;
    格式符:
    %c:显示字符的ASCII码
    %d,%i:显示十进制整数
    %e,%E:科学计数法显示
    %f:显示浮点数
    %g,%G,以科学计数法或浮点数显示数值
    %s:显示字符串
    %u:无符号整数
    %%:显示%本身

将$1套在%s上以字符串的形式输出,默认是没有换行符的
这里写图片描述
这里写图片描述
这里写图片描述
修饰符:
#[.#]: 第一个数字控制显示的宽度,第二个#表示小数点后的精度
%3.1f
-:左对齐(默认为右对齐)
+:显示数值的符号
这里写图片描述
这里写图片描述

* 4、操作符

这里写图片描述
这里写图片描述
这里写图片描述

[root@server1 ~]# awk -F: '{$3>1000?Usertype="common user":Usertype="System user"; printf "%d:" "%s:" "%-10s\n",$3,$1,Usertype}' /etc/passwd

5、PATTERN
(1)empty:空模式,匹配每一行
(2)/正则表达式/:仅处理能够被此模式匹配到的行
对以root开头的行处理
对以/bin/bash结尾的行处理
这里写图片描述
这里写图片描述
对id号答于1000的行处理
这里写图片描述
(3)relational expression:关系表达式,结果有“真“有“假“;结果为“真“才会被处理;
真:结果为非0值,非空字符串
(4)行范围
startline,endline:/pat1/,/pat2/
注意:不能直接给出数字格式
第一个以root开头的行开始到第一个以sync结尾的行进行处理
这里写图片描述

对2-10行进行处理,不能直接写数字
这里写图片描述
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
这里写图片描述

[kiosk@foundation44 Desktop]$ awk -F: 'BEGIN{print " username   uid \n-----------------"}(NR>=5&&NR<=10){printf "%10s" "%5d\n",$1,$3} END{print "end--------------"}' /etc/passwd

默认以空格为分隔符,不管中间有几个空格
以空格为分隔符,输出第1列
以空格为分隔符,输出第1,3列
这里写图片描述
http://www.runoob.com/linux/linux-comm-awk.html

以 : 为分隔符,输出第一列
这里写图片描述

1 1 和 3之间以tab隔开
1 1 和 3之间换行
这里写图片描述
(来自:https://www.cnblogs.com/ginvip/p/6352157.html
显示第3行到第7行的第1个字段
这里写图片描述

请从该文件中过滤出’wtt’字符串与like,最后输出的结果为:wtt like
这里写图片描述

统计用户数量
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

[root@server1 tmp]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd 
[start] user count is  0
。。。。。。。。。。。。。。。
[end] user count is  31

统计文件大小
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值