Linux之AWK

news2024/11/27 4:16:20

目录

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 

 (3)OFS指定输出分隔符

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

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

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

 

(5)显示倒数第2列

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

(6)显示行号

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

 (7)显示当前文件名

awk '{print FILENAME}' awkdemo

自定义变量

(1)-v var = value

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

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

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

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

 (2)在program中直接定义

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

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

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/'

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

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

         查找磁盘大于40%的

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

逻辑操作符

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

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

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

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

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

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

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

 

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

 

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

 

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

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

        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比较大小即可筛选出精确到秒的日志

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]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EditText设置inputType=“textPassword“后hint 英文字体不对,而且不能换行

问题如题,我先上图看下遇到的问题 ( ps: 我只想唱一句 : 你这该死的安卓~~ 让我心在痛 累在流!!!) 很明显字体偏大,字间隔很宽,关键还不会换行, 看一下我们需要的效果: 看到只要把 android:inputType"textPassword" 这一行干掉 一切就是我们想要的,但是产…

sonar 错误 提示 Synchronize on a new “Object“ instead.使用Id 作为锁

文章目录 错误分析先看sonar 给解决方案最终解决方案 public void synchronizedMethod(Integer id) {synchronized (id) {// Code to be synchronized}}错误分析 Synchronize on a new "Object" instead. 不应该在原始包装器&#xff08;即整数、长整型、布尔值等&am…

HDFS中的Trash垃圾桶回收机制

Trash垃圾桶回收机制 文件系统垃圾桶背景功能概述Trash Checkpoint Trash功能开启关闭HDFS集群修改core-site.xml删除文件到trash删除文件跳过从trash中恢复文件清空trash 文件系统垃圾桶背景 回收站&#xff08;垃圾桶&#xff09;是windows操作系统里的一个系统文件夹&#…

c#设计模式-创建型模式 之 工厂模式

前言&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;是一种常用的对象创建型设计模式。该模式的主要思想是提供一个创建对象的接口&#xff08;也可以是抽象类、静态方法等&#xff09;&#xff0c;将实际创建对象的工作推迟到子类中进行。这样一来&#xff0c…

华为认证 | 云计算HCIE3.0改版后有什么变化?

随着技术的不断进步和行业的发展&#xff0c;云计算的HCIE作为华为公司的顶级认证&#xff0c;也进行了版本的更新。 那改版后有哪些变化呢&#xff0c;今天给大家讲讲。 01 HCIE认证简介 HCIE认证是华为公司旗下的顶级专业认证&#xff0c;面向IT领域的高级专业人士。 它涵…

华为数通题库,新一波分享来袭(有答案哟)

1、以下关于OSPF的Router ID描述不正确的是&#xff08;&#xff09;。&#xff08;多选&#xff09; A. OSPF协议正常运行的前提条件是该路由器有Router ID B. Router ID必须是路由器某接口的IP地址 C. 必须通过手工配置方式来指定Router IDD. 在同一区域内Router I D必须相同…

MobiSys 2023 | 基于毫米波振动测量的无接触材料识别

注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:《MobiSys 2023 | 基于毫米波振…

高忆管理:股票低开说明什么?股价跟什么有关?

股票的开盘价和收盘价是投资者重视的重要指标&#xff0c;它反映了股票价值的变化。那么股票低开阐明什么&#xff1f;股价跟什么有关&#xff1f;高忆管理也为大家预备了相关内容&#xff0c;以供参阅。 股票低开阐明什么&#xff1f; 股票低开是指股票的开盘价低于上一个交易…

SpringCloud(31):Nacos配置管理基础应用

1 Nacos配置管理模型 对于Nacos配置管理&#xff0c;通过Namespace、group、Data ID能够定位到一个配置集。 配置集(Data ID) 在系统中&#xff0c;一个配置文件通常就是一个配置集&#xff0c;一个配置集可以包含了系统的各种配置信息&#xff0c;例如&#xff0c;一个配置集…

C 语言的转义字符

转义字符也叫转移序列&#xff0c;包含如下&#xff1a; 转移序列 \0oo 和 \xhh 是 ASCII 码的特殊表示。 八进制数示例&#xff1a; 代码&#xff1a; #include<stdio.h> int main(void) {char beep\007;printf("%c\n",beep);return 0; }结果&#xff1a; …

IntelliJ IDEA Bookmark使用

1 增加 右键行号栏 2 查看 从favorite这里查看 参考IntelliJ IDEA 小技巧&#xff1a;Bookmark(书签)的使用_bookmark idea 使用_大唐冠军侯的博客-CSDN博客

刘汉清:从生活到画布,宠物成为灵感源泉

出生于中国镇江的艺术家刘汉清&#xff0c;其作品展现出他对日常生活的深入洞察力&#xff0c;以及对美的独特理解。他的作品通常没有视觉参考&#xff0c;而是通过对他周围环境的理解&#xff0c;尤其是他的宠物&#xff0c;来进行创作。 在刘汉清的创作过程中&#xff0c;他…

docker容器监控:Cadvisor +Prometheus+Grafana的安装部署

目录 Cadvisor PrometheusGrafana的安装部署 一、安装docker&#xff1a; 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 二、部署Cadvisor 1、被监控主机上部署Cadvisor容器 2、访问cAdvisor页面 三、安装prometheus 1、部署Prometheus…

【Linux 网络】 数据链路层协议

数据链路层协议 数据链路层解决的问题以太网协议认识以太网以太网帧格式 认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式 总结 数据链路层解决的问题 IP拥有将数据跨…

hcip——期中小试

要求&#xff1a; 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 O…

扩增子分析流程——Lotus2: 一行命令完成所有分析

为什么介绍lotus2 因为快&#xff0c;作者比较了lotus2流程和qiime2、dada2、vsearch等&#xff0c;lotus2的速度最快、占用内存最小。 因为方便&#xff0c;只需要一行代码&#xff0c;即可完成全部分析。 lotus2 -i Example/ -m Example/miSeqMap.sm.txt -o myTestRun而且分…

数学建模学习(10):遗传算法

遗传算法简介 • 遗传算法&#xff08;Genetic Algorithms&#xff09;是基于生物进化理论的原理发展起来的一种广为 应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之 间的信息交换&#xff0c;搜索不依赖于梯度信息。它是20世纪70年代初期由美国…

【MMU】认识 MMU 及内存映射的流程

MMU&#xff08;Memory Manager Unit&#xff09;&#xff0c;是内存管理单元&#xff0c;负责将虚拟地址转换成物理地址。除此之外&#xff0c;MMU 实现了内存保护&#xff0c;进程无法直接访问物理内存&#xff0c;防止内存数据被随意篡改。 目录 一、内存管理体系结构 1、…

kuboard安装和使用

windows平台下使用docker和docker-compose部署Kuboard&#xff0c;并添加Docker Desktop for windows的k8s单机集群 使用docker安装 docker run -d \--restartunless-stopped \--namekuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT"http://内网IP:80&…

常量池-JVM(十九)

上篇文章说gc日志以及arthas。 Arthas & GC日志-JVM&#xff08;十八&#xff09; 一、常量池 常量池主要放两大类&#xff1a;字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。 类和接口的全限定名。字段的名称和…