Linux | awk 命令「建议收藏」

Linux | awk 命令「建议收藏」awk命令简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得非常强大,awk其实是一门语言,”格式扫描和处理语言“,它允许您创建

大家好,又见面了,我是你们的朋友全栈君。

awk 命令简介

awk 是一个强大的文本分析工具,相对于grep 的查找,sed的编辑,awk 在其对数据分析并生成报告时,显得非常强大,awk 其实是一门语言,”格式扫描和处理语言“,它允许您创建简短的程序,这些程序读取输入文件 ,为数据排序,处理数据,对输入执行计算以及生成报表等。

awk 命令格式

  • 命令行方式
	awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
  • shell 脚本

  • akw文件

	awk -f awk-script-file input-file(s)

awk 选项参数

参数 说明
-F 指定输入文本的分隔符,字符串或者是一个正则表达式
-v 定义一个用户自定义变量
-f 从指定的文件中读取 awk 命令
-W 打印简短的版权信息 或 打印关于不能向伟统unix平台移植的结构

image-20210907112547902

last 命令用于查询最后登录的5个用户及详情 -n 5 是取最后两个

如果我们只想取登录的用户,使用awk最简单:

	last -n 5 | awk '{print $1}'

image-20210907112941632

	# 也可以取 1 ,3 列
	last -n 5 | awk '{print $1,$3}'
	# awk 命令中列是从1开始取的,所以 $0 代表的是这一行
	last -n 5 | awk '{print $0}' # 和 last -n 5 输出相同 

-F 的使用

这里使用的例子是var/log/yum.log、文件中的内容,在我们平时,也有处理日志的需求,所以使用 awk会更加的方便。

image-20210907130945636

	# 如果我们想要得到所有安装和更新的软件列表
	cat yum.log | awk -F: '{print $4,$5}'

image-20210907131231137

-F 可以使用任意字符充当分割符号

-v 的使用

创建测试文本:awk_test.txt 内容为:

image-20210907132641665

可以使用 awk 对变量进行赋值,然后使用变量批量计算每一行的数据。

cat awk_test.txt | awk -v a=1 '{print $1 + a}'

image-20210907133357171

结果和上面文件中的内容有一点差别,是因为最后一行其实是一个空行,但是在进行加法的时候,这一行也加上了1,但是不是按照数字的加减法的,是按照拼接。

awk 内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出字段分隔符,默认值与输入字段分隔符一致。
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)

内建变量的使用

    awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt

    FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
    ---------------------------------------------
    log.txt    2    1         5    1
    log.txt    2    2         5    2
    log.txt    2    3         3    3
    log.txt    2    4         4    4
    awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt

    FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
    ---------------------------------------------
    log.txt    2    1    '    1    1
    log.txt    2    2    '    1    2
    log.txt    2    3    '    2    3
    log.txt    2    4    '    1    4
    # 输出顺序号 NR, 匹配文本行号
    awk '{print NR,FNR,$1,$2,$3}' log.txt

    1 1 2 this is
    2 2 3 Are you
    3 3 This's a test
    4 4 10 There are
    # 指定输出分割符
    $  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
    ---------------------------------------------
    2 $ this $ test
    3 $ Are $ awk
    This's $ a $
    10 $ There $

awk 使用正则表达式

使用正则,字符串匹配

    # 输出第二列包含 "th",并打印第二列与第四列
    awk '$2 ~ /th/ {print $2,$4}' log.txt
    this a

~ 表示模式开始。// 中是模式。

    # 输出包含 "re" 的行
    awk '/re/ ' log.txt
    3 Are you like awk
    10 There are orange,apple,mongo

忽略大小写

    awk 'BEGIN{IGNORECASE=1} /this/' log.txt
    2 this is a test
    This's a test

模式取反

    awk '$2 !~ /th/ {print $2,$4}' log.txt
    Are like
    a
    There orange,apple,mongo
    awk '!/th/ {print $2,$4}' log.txt
    Are like
    a
    There orange,apple,mongo

我的公众号

Linux | awk 命令「建议收藏」


细节决定成败!
个人愚见,如有不对,恳请斧正!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154928.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • stringbuffer stringbuilder区别(其他和其它的区别)

    String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字

    2022年4月11日
    45
  • 什么是Unicode字符_Unicode格式字符是什么

    什么是Unicode字符_Unicode格式字符是什么写这篇博客的原因,从做软件开始,什么ASCII码,Unicode,UTF-8,UTF-16,UTF-32……这些鬼东西总是经常碰到,只知道这些鬼是编码格式,其他的就啥都不清楚了,既然总是遇

    2022年8月1日
    9
  • docker-compose 集群_hadoop完全分布式搭建步骤

    docker-compose 集群_hadoop完全分布式搭建步骤前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有

    2022年7月28日
    23
  • 远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]

    远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]今天学习linux用远程工具连接时,连接不上,出现了一个类似函数的东西,运用了排除法,1.先检查了虚拟机服务是否开启2.然后ping网关看能通吗3.然后pingDNS域名,再pingwww.baidu.com都能ping通,百思不得其解然后通过查资料,输入route发现default后面并没有分配默认网关于是输入routeadddefaultgw192.168…

    2022年5月8日
    335
  • Android resource linking failed_android:authorities

    Android resource linking failed_android:authorities我正在尝试处理我的主类中的推送通知(并且我也有GCMBroadcastReceiver-用于我未运行主类时出现的所有通知)但是registerReceiver无法正常工作(GCMBroadcasrReceiver正常工作)我的代码:publicclassMainextendsActivity{protectedvoidonCreate(BundlesavedInstanceStat…

    2025年10月30日
    4
  • Iocomp ActiveX VCL Ultra 5.12 SP6

    Iocomp ActiveX VCL Ultra 5.12 SP6Upto63Controls,choosethepacklevelyouneed!Real-Time,High-Speedcontrols!Professionallydesignedtofunctionlikereal-worldcontrols!Built-Incustompropertyeditorsforeaseofsetup!GDIbasedgraphics!RoyaltyFreeDistribution(ExcludesHMI

    2022年7月17日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号