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 命令「建议收藏」


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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 嵌入式软件工程师待遇怎么样

    嵌入式软件工程师待遇怎么样本来大家选择嵌入式也就是冲着嵌入式的发展前景不错而来,所以在嵌入式这块还是有很多不知道的知识,这些也都要等着老师去给你讲解了,下面先来了解下嵌入式软件工程师待遇怎么样吧。嵌入式软件工程师待遇怎么样:1、应届毕业生如果你是在一线城市的话,有人带你,你自己有比较学的好,那么你的薪资待遇就可以达到6k+,但是不同公司不同待遇,而且不同地区不同的薪资待遇,就像北上广,这些地区薪资待遇是比其他地区高出2k以上,甚至更高的。就像人家阿里,那工资肯定就比其他公司要高的多。所以得看你要去什么地方发展了,但是平均

  • php实现第三方登录

    php实现第三方登录

    2021年10月25日
  • C语言之-1与0xffffffff[通俗易懂]

    C语言之-1与0xffffffff[通俗易懂]#include<stdio.h>intmain(){ unsignedintuint; inti=-1; uint=i; printf("%x%d\n",uint,i);//输出ffffffff-1 uint=0xffffffff; i=uint; printf("%x%d\n",uint,i);//输…

  • javacv学习之实现matlab中imfill算法(孔洞填充)

    javacv学习之实现matlab中imfill算法(孔洞填充)因生产需要计算图像的面积,首先第一步就是要先将图像中有洞的地方给它填上,网上找了半天说是matlab中的imfill算法就能直接填上,但我对matlab也不熟也不想用它,结果网上搜资料看看到很多C++的博主写的可以直接用opencv搞定,我一想opencv能搞定那肯定javacv也能搞,所以就有了下面的内容。废话不多说直接上代码publicstaticvoidmain(String[]args){System.loadLibrary(Core.NATIVE_LIBRAR

  • 【stm32】UART和USART简单区别

    【stm32】UART和USART简单区别USART:通用同步和异步收发器UART:通用异步收发器当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能。这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。…

  • 恢复微信撤回的图片(不容root,极其简单)

    恢复微信撤回的图片(不容root,极其简单)女友最近用微信发的一些照片总是让我看一下就给撤回,作为程序员的我,当然不甘示弱,怎可以在我熟悉的领域胡作非为呢?于是上网搜了一下恢复微信撤销图片的方法,网上给出的方法各种各样,需要各种软件,还需要root,不仅晦涩难懂而且极其麻烦,一看都不适合给小白使用,作为程序员的我当然也不愿意这样,于是我就自己琢磨。首先,你要相信这样一个道理,你能看到的东西,一定会存在你手机的某个角落,如图片,声音,视频,

发表回复

您的电子邮箱地址不会被公开。

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