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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dos2unix命令解决 Shell 脚本无法执行的问题

    dos2unix命令解决 Shell 脚本无法执行的问题 1.解决问题    在执行脚本时,报了以下错误:-sh:./test.sh:/bin/bash^M:badinterpreter:Nosuchfileordirectory    出现上述类似的错误,原因是脚本在Windows下编辑然后上传到Linux系统里执行。我们编辑的.sh文件的格式为dos格式,而Linux只能执行unix格式的脚本。  我…

    2022年5月31日
    39
  • 5款优秀的文档管理系统「建议收藏」

    5款优秀的文档管理系统「建议收藏」1.easyopen一个简单易用的接口开放平台,平台封装了常用的参数校验、结果返回等功能,开发者只需实现业务代码即可。技术点加密算法(MD5、AES、RSA) Netty(编解码、长连接、断开重连) 限流(漏桶策略、令牌桶策略) 权限(RBAC、校验) session(单机、分布式) 注解(文档生成) token(jwt、accessToken) SDK(Java、C#…

    2022年5月18日
    64
  • asp.net response.ContentType 下载文件的四种方法「建议收藏」

    asp.net response.ContentType 下载文件的四种方法「建议收藏」原址:http://www.cnblogs.com/xtgyiq/archive/2009/07/06/1517415.htmlprotectedvoidButton1_Click(objectsender,EventArgse)   { 1 protected void Button1_Click(object sender, Even

    2022年7月19日
    13
  • Dreamweaver2019版安装教程

    Dreamweaver2019版安装教程dreamweavercc2019新功能:1、CEF更新dreamweavercc2019现已与Chromium嵌入式框架的最新版本进行集成,这样设计人员和开发人员就可以构建与HTML5兼容的网站,并显示Flexbox元素、CSS网格等内容。2、ES6支持全新的EcmaScript6支持包括类、方法、箭头函数、生成器函数的快速输入列表,以及ES6代码的lint…

    2022年10月9日
    0
  • python zipfile.zipfile_confirm password

    python zipfile.zipfile_confirm password”””@author:Peng(非原创)记录:开发历程”””最近在写一个AndroidAPP,需下载服务器上的数据。有些PDF如果直接传输的话,将会增加通信的数据量,使下载时间变长。服务器在传输这些数据之前先对其进行压缩,客户端接收到数据之后进行解压,这样可以减小网通传输数据的通信量,缩短下载的时间,从而增加客户体验。用Python做类似的工作,只要使用zipfile模块提供的api就可以轻松的…

    2022年9月17日
    0
  • windows10+nvidia驱动+cuda10.1+cudnn安装教程

    windows10+nvidia驱动+cuda10.1+cudnn安装教程一、显卡驱动提前安装好nvidia驱动,windows一般都自动安装了nvidia驱动了没有安装驱动可以去官网下载驱动https://www.geforce.cn/drivers选择自己对应的显卡驱动,默认安装就可以了。下载之前查看自己显卡驱动和cuda版本号之间的关系,如下图所示,然后进行选择性安装。https://docs.nvidia.com/cuda/cuda-to…

    2022年5月24日
    158

发表回复

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

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