Linux之AWK

这篇具有很好参考价值的文章主要介绍了Linux之AWK。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Linux之AWK 

定义

语法格式

常用选项

 awk 变量

内置变量

        格式

        案例

         (1)编写一个文本名字叫做awkdemo,里面内容如下

         (2)FS指定输入分隔符

         (3)OFS指定输出分隔符

         (4)RS指定输入的换行符

         (5)显示倒数第2列

         (6)显示行号

         (7)显示当前文件名

自定义变量

 (1)-v var = value

 (2)在program中直接定义

printf命令

语法格式

 (1)格式化输出

 (2)格式符 --- 与item对应

 (3)修饰符 --- 放在 %c[/d/e/f...]之间

案例

模式匹配符

        查询以/dev开头的磁盘信息

        只显示磁盘使用状况和磁盘名

         查找磁盘大于40%的

逻辑操作符

条件表达式(三目表达式)

awk PATTERN匹配部分

格式

案例

案例 --- 筛选给定时间范围内的日志

第一种时间格式

第二种时间格式


Linux之AWK 

定义

        awk是一种编程语言,用于在linux/unix下对文本数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势

语法格式

        awk` `[options] ``'program'` `var=value ``file``…``awk` `[options] -f programfile var=value ``file``…``awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...

常用选项

         -F fs --- fs指定输入分隔符号,fs可以使字符串或正则表达式,如-F

        -v var=value --- 复制一个定义用户变量,将外部变量传递给awk

        -f scripfile --- 从脚本文件中读取awk

 awk 变量

        变量 --- 内置和自定义变量,每个变量前加-v 命令选项

内置变量

格式

  1. FS  --- 输入字段分隔符,默认为空白字符

  2. OFS  --- 输出字段分隔符,默认为空白字符

  3. RS  --- 输入记录分隔符,指定输入时的换行符,原换行符仍有效

  4. ORS  ---输出记录分隔符,输出时用指定符号代替换行符

  5. NF  --- 字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列

  6. NR  --- 行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始

  7. FNR --- 各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始

  8. FILENAME --- 当前文件名

  9. ARGC --- 命令行参数的个数

  10. ARGV  --- 数组,保存的是命令行所给定的各参数,查看参数

案例

(1)编写一个文本名字叫做awkdemo,里面内容如下

hello:world
linux:redhat:lalala:hahaha
along:love:youou

(2)FS指定输入分隔符

awk -v FS=':' '{print $1,$2}' awkdemo 

Linux之AWK,网络安全,linux,运维,服务器

 (3)OFS指定输出分隔符

awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

 (4)RS指定输入的换行符

awk -v RS=':' '{print $1,$2}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器 

(5)显示倒数第2列

awk -F: '{print $(NF-1)}' awkdemo 

Linux之AWK,网络安全,linux,运维,服务器

(6)显示行号

root@ubuntu:/test# awk '{print NR}' awkdemo 

Linux之AWK,网络安全,linux,运维,服务器

 (7)显示当前文件名

awk '{print FILENAME}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

自定义变量

(1)-v var = value

        1.先定义变量,后执行动作print

awk -v name="along" -F: '{print name":"$0}' 

Linux之AWK,网络安全,linux,运维,服务器

        2.在执行动作print后定义变量

awk -F: '{print name":"$0;name="along"}' awkdemo 

Linux之AWK,网络安全,linux,运维,服务器

 (2)在program中直接定义

        可以把执行的动作放在脚本中,直接调用脚本-f

root@ubuntu:/test# cat awk.txt 
{name="along";print name,$1}
root@ubuntu:/test# awk -F: -f awk.txt awkdemo 

Linux之AWK,网络安全,linux,运维,服务器

printf命令

        比print更强大

语法格式

(1)格式化输出

        printf` `"FORMAT"``, item1,item2, ...

  1. 必须指定FORMAT
  2. 不会自动换行,需要显式给出换行控制符,\n
  3. FORMAT 中需要分别为后面每个item 指定格式符

 (2)格式符 --- 与item对应

        %c: --- 显示字符的ASCII码

        %d, %i: --- 显示十进制整数

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

        %f --- 显示为浮点数,小数 %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

        %g, %G --- 以科学计数法或浮点形式显示数值

        %s --- 显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

        %u --- 无符号整数

        %% --- 显示% 自身

 (3)修饰符 --- 放在 %c[/d/e/f...]之间

        #[.#] --- 第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f

        - --- 左对齐(默认右对齐) %-15s

        + --- 显示数值的正负符号 %+d

案例

模式匹配符

        查询以/dev开头的磁盘信息

df -h |awk -F: '$0 ~ /^\/dev/'

Linux之AWK,网络安全,linux,运维,服务器

        只显示磁盘使用状况和磁盘名

df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}'

Linux之AWK,网络安全,linux,运维,服务器

         查找磁盘大于40%的

df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 40'

Linux之AWK,网络安全,linux,运维,服务器

逻辑操作符

 awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd

Linux之AWK,网络安全,linux,运维,服务器

wk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

Linux之AWK,网络安全,linux,运维,服务器

 awk -F: '!($3==0) {print $1}' /etc/passwd

Linux之AWK,网络安全,linux,运维,服务器

awk -F: '!($0 ~ /bash$/) {print $1,$3}' /etc/passwd

Linux之AWK,网络安全,linux,运维,服务器

条件表达式(三目表达式)

awk -F: '{$3 >= 1000?usertype="common user":usertype="sysadmin user";print usertype,$1,$3}' /etc/passwd

Linux之AWK,网络安全,linux,运维,服务器

awk PATTERN匹配部分

        PATTERN:根据pattern 条件,过滤匹配的行再做处理

格式

(1)如果未指定:空模式,匹配每一行

(2)/regular expression/ :仅处理能够模式匹配到的行,正则,需要用/ / 括起来

(3)relational expression:关系表达式,结果为“真”才会被处理

                真:结果为非0值,非空字符串

                假:结果为空字符串或0值

(4)line ranges:行范围

  startline(起始行),endline(结束行):/pat1/,/pat2/ 不支持直接给出数字,可以有多段,中间可以有间隔

(5)BEGIN/END 模式

          BEGIN{}: 仅在开始处理文件中的文本之前执行一次

          END{} :仅在文本处理完成之后执行

案例

awk -F: '{print $1}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

 

awk -F: '/along/{print $1}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

 

awk -F: '1{print $1}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

 

awk -F: 'BEGIN{print "第一列"}{print $1} END{print "结束"}' awkdemo

Linux之AWK,网络安全,linux,运维,服务器

案例 --- 筛选给定时间范围内的日志

        grep/sed/awk用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现,但是awk提供了mktime()函数,它可以将时间转换成epoch时间值

# 2019-11-10 03:42:40转换成epoch为1970-01-01 00:00:00
$ awk 'BEGIN{print mktime("2019 11 10 03 42 40")}'

将时间转换成一个时间戳

        借此,可以取得日志中的时间字符串部分,再将它们的年、月、日、时、分、秒都取出来,然后放入mktime()构建成对应的epoch值。因为epoch值是数值,所以可以比较大小,从而决定时间的大小

第一种时间格式

        将2019-11-10T03:42:40+08:00格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志

BEGIN{
	#选择要筛选日志的时间,将其时间构建成epoch值
    which_time = mktime("2019 11 10 03 42 40")
}

{
	# 取出日志中的日期时间字符串部分
	match($0,"^.*\\[(.*)\\].*",arr)

	# 将日期时间字符串转换为epoch值
	tmp_time = strptime1(arr[1])

	# 通过epoch值来比较时间大小并打印
	if(tmp_time > which_time){print}
}

# 构建的时间字符串格式为:"2019-11-10T03:42:40+08:00"
function strptime1(str,arr,Y,M,D,H,m,S){
	patsplit(str,arr,"[0-9]{1,4}")          
	#patsplit是pattern split的意思,是将pattern匹配成功的部分放到队列里,默认以FPAT为匹配正则
	Y=arr[1]
	M=arr[2]
	D=arr[3]
	H=arr[4]
	m=arr[5]
	S=arr[6]
	return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
	#sprintf是将输出保存在一个字符串里- sprintf(fmt, expr-list)
}

第二种时间格式

        将10/Nov/2019:23:53:44+08:00格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志文章来源地址https://www.toymoban.com/news/detail-635582.html

BEGIN{
  # 要筛选什么时间的日志,将其时间构建成epoch值
  which_time = mktime("2019 11 10 03 42 40")
}

{
  # 取出日志中的日期时间字符串部分
  match($0,"^.*\\[(.*)\\].*",arr)
  
  # 将日期时间字符串转换为epoch值
  tmp_time = strptime2(arr[1])
  
  # 通过比较epoch值来比较时间大小
  if(tmp_time > which_time){
    print 
  }
}

# 构建的时间字符串格式为:"10/Nov/2019:23:53:44+08:00"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # dt_sr = "10 Nov 2019 23 53 44 08 00"
  split(dt_str,arr," ")
  Y=arr[3]
  M=mon_map(arr[2])
  D=arr[1]
  H=arr[4]
  m=arr[5]
  S=arr[6]
  return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}

function mon_map(str,mons){
  mons["Jan"]=1
  mons["Feb"]=2
  mons["Mar"]=3
  mons["Apr"]=4
  mons["May"]=5
  mons["Jun"]=6
  mons["Jul"]=7
  mons["Aug"]=8
  mons["Sep"]=9
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]
}

到了这里,关于Linux之AWK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全运维-安全加固篇

    vsftpd禁用匿名用户 设置不允许通过root账户进行ssh登录系统 MYSQL关闭TCP/IP远程连接 开启SYN Cookie内核参数 数据库安全加固 linux 安全限制 vi /etc/profile 新加入:TMOUT=600  //600秒无操作,自动退出  [root@station90 桌面]# awk -F : \\\'($2==\\\"\\\") {print $1}\\\' /etc/shadow //检查空口令帐号 zhang3 [root@st

    2024年02月10日
    浏览(43)
  • 「Kali Linux」网络安全黑客自学、网络渗透(文末送书)

    目录 1.背景介绍 2.读者对象 3.随书资源 4.本书目录 5.本书概览 6.活动参与方式  对于企业网络安全建设工作的质量保障,业界普遍遵循PDCA(计划(Plan)、实施(Do)、检查(Check)、处理(Act))的方法论。近年来,网络安全攻防对抗演练发挥了越来越重要的作用。 企业的安

    2024年02月08日
    浏览(55)
  • 深入探索:Kali Linux 网络安全之旅

    目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 \\\"Kali\\\" 可能指的是 Kali Linux,它是一种基于 Debian 的 Linux 发行版,专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和系统安全性的工具,以及为安全专业人员

    2024年02月12日
    浏览(45)
  • 【网络安全】-Linux操作系统—操作系统发展历史与Linux

    操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的系统软件,它是计算机系统的核心与基石。操作系统的发展历史可以追溯到20世纪50年代。 初期的操作系统 在计算机技术的早期,操作系统并不存在。那时,计算机使用一种叫做批处理系统的方式来运行程序。

    2024年02月03日
    浏览(63)
  • 【文末送书】Kali Linux与网络安全

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号 《机器和智能》 回复 “python项目

    2024年02月08日
    浏览(42)
  • Linux网络操作实操指南:从网络配置到安全管理

    Linux是一种开源的操作系统,具有稳定性高、安全性好、可定制性强等优点。作为一名Linux用户,掌握基本的Linux网络操作是非常必要的。以下是Linux网络操作的几个方面,包括具体的实操步骤: 1. 网络配置 Linux中的网络配置需要设置IP地址、子网掩码、网关等参数,以实现网

    2024年02月09日
    浏览(47)
  • 拒绝网络攻击--nginx和linux的安全加固

    隐藏nginx版本号 安装启服务 访问不存在的路径 如果访问页面不存在就会暴露nginx版本号,进一步提高了被攻击的可能性 命令行访问: 隐藏版本信息 再次访问不存在的路径,版本号消失 防止DOS、DDOS攻击 DDOS:分布式拒绝服务 配置nginx连接共享内存为10M,每秒钟只接收一个请

    2023年04月26日
    浏览(54)
  • Kali Linux:网络与安全专家的终极武器

    Kali Linux,对于许多网络和安全专业人士来说,这是一个无人不知、无人不晓的名字。它是专为网络和安全测试、渗透测试以及数字取证等任务而设计的强大操作系统。本篇文章将深入介绍Kali Linux的特点、优势以及如何使用它来进行各种安全任务。 Kali Linux 是一款基于 Debian

    2024年02月06日
    浏览(39)
  • 网络安全 Day28-运维安全项目-加密隧道

    两点如何传输数据最安全 方案1: 专线(成本高) 方案2: 硬件设备3层路由器 , 硬件vpn设备 vpn virtual private network 虚拟专有网络 深信服VPN 方案3: 开源软件 pptp (不推荐) 使用最简单,不是很稳定,依赖于 网络设备 的支持. OpenVPN 实现用户/运维/开发,访问网站内网. 运营:通过OpenVPN实现网

    2024年02月13日
    浏览(42)
  • 卷运维不如卷网络安全

    最近发现很多从事运维的选择了辞职,重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的,不管什么环节出现问题,基本都是运维背锅。背锅也就罢了,薪资水平也比不上别的岗位。 一般运维的薪资水平大多数都是6-9K,还要高频出差。规模

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包