Linux文本之awk编译器

news2024/10/6 5:57:58

一、awk介绍

1)awk概述

AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行

2)awk的工作原理 

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令;
  • sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”再进行处理;
  • awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示;
  • 在使用awk命令的过程中,可以使用逻辑操作符“&&”表示与、“||”表示或、“!”表示非,还可以进行简单的数学运算如+-*/%^,分别表示加减乘除取余和乘方

3)awk的数学计算(浮点运算)

#bash不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk处理
#!/bin/bash

#加
f=$(echo "4.3+2.5"|bc)
echo "4.3+2.5=$f"

#减
f=$(echo "4.3-2.5"|bc)
echo "4.3-2.5=$f"

#乘
f=$(echo "4.30*2.50"|bc)
echo "4.3*2.5=$f"

#除
f=$(echo "scale=2;4.3/2.5"|bc)
echo "4.3/2.5=$f"

#混合运算
f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc)
echo "2.2/(2.2-1.1)*2+1.1=$f"

#加
f=$(awk 'BEGIN{print 4.5+3.4 }')
echo "4.5+3.4=$f"

#减
f=$(awk 'BEGIN{print 4.5-3.4 }')
echo "4.5-3.4=$f"

#乘
f=$(awk 'BEGIN{print 4.5*3.4 }')
echo "4.5*3.4=$f"

#除
f=$(awk 'BEGIN{print 4.5/3.4 }')
echo "4.5/3.4=$f"

#混合
f=$(awk 'BEGIN{print (4.5-3.4)*2+3 }')
echo "(4.5-3.4)*2+3=$f"

二、awk的基础用法和选项

1)awk的基本格式及其内置变量

 awk 选项 '模式或条件 {操作}' 文件1 文件2...

 ​awk -f 脚本文件 文件1 文件2
  • 注意一定是单引号:'模式或条件 {操作}'

  • { }外指定条件,{ }内指定操作。

  • 用逗号指定连续的行,用 || 指定不连续的行。&&表示”且“。

  • 内建变量,不能用双引号括起来,不然系统会把它当成字符串

内置变量作用
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
NR当前处理的行的行号(序数)
NF当前处理的行的字段个数。$NF代表最后一个字段
FS列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
OFS输出内容的列分隔符
FILENAME被处理的文件名
RS
行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n"

2)基本打印用法

①打印文章所有内容

[root@localhost awk]#awk '{print}' english.txt 

另外:0和1放置{ }前,能够起到限制答应的作用(默认为"1") 

[root@localhost awk]#awk '{print $0 }' english.txt 

 ②打印行内容及其行号

[root@localhost awk]#awk '{print NR}' english.txt 

[root@localhost awk]#awk '{print NR,$0}' english.txt

 ③指定行和指定行范围打印

[root@localhost awk]#awk 'NR==3{print}' english.txt 
 
[root@localhost awk]#awk 'NR==3,NR==5{print}' english.txt 
 
[root@localhost awk]#awk '(NR>=3)&&(NR<=5){print}' english.txt 

④奇偶行打印

[root@localhost awk]#awk 'NR%2==0{print}' english.txt 
 
[root@localhost awk]#awk 'NR%2==1{print}' english.txt 

 ⑤奇偶打印特殊方式的引入——getline

 getline的工作过程:

1)当getline左右无重定向符号(“<”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是是光标跳转至下一行的内容(也就是第二行)

原因:getline运行之后awk会改变NF,NR,$0,FNR等内部变量,所以此时读取$0的行号不再为1,而是2

拓展:

FNR:awk当前读取的记录数,其变量值小于等于NR,(比如说当读取完第一个文件后,读取第二个文件,FNR是会从0开始进行,而NR不会)

因此读取两个或两个以上的文件,NR==FNR,可以 判断是不是在读取第一个文件

2)当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入

getline 打印偶数行: 

[root@localhost awk]#awk '{getline;print $0}'  english.txt 
 
[root@localhost awk]#seq 10|awk '{getline;print $0}' 

getline 打印奇数行 :

[root@localhost awk]#awk '{print $0;getline}'  english.txt 
 
[root@localhost awk]#seq 10|awk '{print $0;getline}' 

⑥文本内容匹配过滤打印

[root@localhost awk]#awk '/^root/{print}' /etc/passwd
 
[root@localhost awk]#awk '/bash$/{print}' /etc/passwd

 3)BEGIN打印模式 

格式:awk 'BEGIN{...};{...};END{...}' 文件

处理过程:

  1. 在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作
  2. 中间的{...} 是真正用于处理文件的命令操作
  3. 在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句

示例:

[root@localhost awk]#awk 'BEGIN{x=1};{x++};END{print x}' english.txt 

拓展:

awk是从c语言中继承到Linux,所以在BEGIN模式中变量x,可以直接运用,无需"$"声明获取变量值

4)对字段进行处理打印 

①指定分隔符打印字段

普通指定方式:

[root@localhost awk]#head -n5 /etc/passwd |awk  -F':'  '{print$3}' 
 
[root@localhost awk]#head -n5 /etc/passwd |awk  -F':'  '{print$5}' 

BEIGIN模式指定:

[root@localhost awk]#head -n5 /etc/passwd|awk 'BEGIN{FS=":"};{print $5}'
 
[root@localhost awk]#head -n5 /etc/passwd|awk 'BEGIN{FS=":"};{print $3}'

②条件判断打印

正向判断打印:

[root@localhost awk]#awk -F: '$3>500{print $0}' /etc/passwd

判断取反打印: 

[root@localhost awk]#awk -F: '!($3>10){print $0}' /etc/passwd

除此之外,甚至可以直接进行if语句判断打印:

[root@localhost awk]#awk -F: '{if($3>500){print $0}}' /etc/passwd

三、awk的三元表达式与精准筛选用法

1)awk的三元表达式

①shell的三元表达式

​Shell中: [ 条件表达式 ] && A || B

 - 条件表达式成立(为真)时,会取||前面的值A。  - 条件表达式不成立(为假)时,会取||后面的值B

②awk的三元表达式运用 

格式:awk     '(条件表达式)?(A表达式或者值):(B表达式或者值)'
[root@localhost awk]# awk -F: '{max=($3>=$4)?$3:$4;{print max,$0}}' /etc/passwd|sed -n '1,6p'

同时:通过管道符sed命令只打印其中的前六行内容

2)awk的精准筛选 

精准筛选方法:

$n(> < ==)  用于对比数值
$n~"字符串"代表第n个字段 包含 某个字符串的作用
$n!~"字符串"代表第n个字段 不包含 某个字符串的作用
$n=="字符串"代表第n个字段 为 某个字符串的作用
 $n!="字符串"代表第n个字段 不为 某个字符串的作用
 $NF  代表最后一个字段

运用1:输出第七个字段包含“bash”所在行的第一个字段和最后一个字段

[root@localhost awk]#awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd

运用2:输出第七个字段不包含“nologin”所在行的第一个字段和最后一个字段 

[root@localhost awk]#awk -F: '$7!~"nologin" {print $1,$NF}' /etc/passwd

运用3:指定第六个字段为/home/lisi   ,第七个字段为/bin/bash,输出满足这些条件所在行的第一个和最后一个字段

[root@localhost awk]#awk -F: '($6=="/home/lisi")&&($7==/bin/bash)"nologin" {print $1,$NF}' /etc/passwd

四、awk的分隔符用法

1 )RS 指定行分隔符

 awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。内置变量RS的预设值是"\n"。

但是也可以在使用BEGIN模式在操作前进行行分隔符的改变

[root@localhost awk]#echo $PATH|awk 'BEGIN{RS=":"};{print NR,$0}'

2)指定输出的分隔符

FS 输入时的列分隔符

OFS 输出内容的列分隔符。($n=$n用于激活,否则不生效,n且必须存在)

对于输出时改变分隔符,我们常用到tr,awk,它们都可以实现在输出内容改变原本的分隔符

①tr改变分隔符输出

[root@localhost awk]#echo a b c d
 
[root@localhost awk]#echo a b c d|tr " " ":"

②awk改变输出分隔符

直接修改输出分隔符 :

[root@localhost awk]#echo a b c d|awk '{OFS=":" ; $1=$1;print $0}'

BEGIN模式中修改输出分隔符:

[root@localhost awk]#echo a b c d|awk 'BEGIN{OFS=":"};{$2=$2;print $0}'
 
[root@localhost awk]#echo a b c d|awk 'BEGIN{OFS=":"};{$3=$3;print $0}'
 
[root@localhost awk]#echo a b c d|awk 'BEGIN{OFS=":"};{$4=$4;print $0}'
 
[root@localhost awk]#echo a b c d|awk 'BEGIN{OFS=":"};{$5=$5;print $0}'

五、awk结合数组运用

1)awk中定义数组打印

[root@localhost awk]#awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[1]} '
 
[root@localhost awk]#awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[0]} '
 
[root@localhost awk]#awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[2]} '

此外:awk中的数组还能形成遍历 

2)awk打印文件内容去重统计

①去重打印数组

[root@localhost awk]#echo ${arry[@]}|awk -v RS=' '  '!a[$1]++'
 
[root@localhost awk]#awk -v RS=' '  '!a[$1]++' <<< ${arry[@]}

②处理文件去重统计

原理:将文件的字段内容变为定义的数组下标,对其进行匹配读取累加(只有遇到完全一致的才会累加),此时重复的次数在for循环的作用下成为了数组对应下标的元素

所以输出该下标和元素(就等同于输出重复的字段内容  以及 统计的重复次数)

[root@localhost awk]#awk '{a[$1]++};END{for(i in a){print i,a[i]}}' test.txt

需求: 

统计ssh登录失败的用户及其登录失败(日志:/var/log/secure中有记录)的次数(通常我们会认为失败三次,存在着暴力破解登录的可能,意味该主机存在隐患)解决方案:将其筛选出来就把IP加入到黑名单中 /etc/hosts.deny。

纯awk筛选统计: 

[root@localhost awk]# awk '/Failed password/{a[$11]++};END{for(i in a){print i,a[i]}}' /var/log/secure

其他awk组合方式:

[root@localhost awk]#awk '/Failed password/{print $11}' /var/log/secure |sort -n 
 
[root@localhost awk]#awk '/Failed password/{print $11}' /var/log/secure |sort -n |uniq -c

 六、常用awk筛选数据实例

下面有很多的awk获取数据都可以配合脚本加计划性任务编写为一个全自动化运维的检测脚本 

1 )获取本机上一次开机时间

[root@localhost awk]#date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y%m%d %H:%M:%S"

 2)获取本机IP地址

[root@localhost awk]#ifconfig ens33|awk '/inet /{print $2}'

 3)检测本机cpu 15分钟内的平均负载

一般超过百七十,就要注意了!!

[root@localhost awk]#uptime|awk '{print $NF}'

4)检测入站网卡流量和出站网卡的流量

#入站网卡
[root@localhost awk]#ifconfig ens33|awk '/RX p/{print $5}'
 
#出站网卡
[root@localhost awk]#ifconfig ens33|awk '/TX p/{print $5}'

5)内存剩余量

[root@localhost awk]#free -m |awk '/^Mem/{print $4}'

6)根分区剩余量

[root@localhost awk]#df -h|awk '/\/dev\/sda1/{print $4}'

  其他有用数据的提取(非awk)

user=`cat /etc/passwd |wc -l`
echo "本地账户数量为:"$user
login=`who | wc -l`
echo "当前登陆计算机的账户数量为:"$login
process=`ps aux | wc -l`
echo "当前计算机启动的进程数量为:"$process
soft=`rpm -qa | wc -l`
echo "当前计算机已安装的软件数量为:"$soft

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

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

相关文章

尚硅谷大数据技术NiFi教程-笔记02【NiFi(使用案例,同步文件、离线同步mysql数据到hdfs、实时监控kafka数据到hdfs)】

尚硅谷大数据技术-教程学习路线-笔记汇总表【课程资料下载】 视频地址&#xff1a;尚硅谷大数据NiFi教程&#xff08;从部署到开发&#xff09;_哔哩哔哩_bilibili 尚硅谷大数据技术NiFi教程-笔记01【NiFi&#xff08;基本概念、安装、使用&#xff09;】尚硅谷大数据技术NiFi教…

探索古文明,玛雅文明衰落的原因

说起玛雅文明&#xff0c;大家在各种小说或者电影中或多或少的都有听说过&#xff0c;那么这个文明到底是怎么一回事呢&#xff1f;今天老铁就带大家好好的了解下。 玛雅文明存在的时间大致是在公元前2000年至公元1500年之间&#xff0c;这个文明见证了中美洲地区的一段辉煌的…

Cefsharp109.1.110(winfrom)最新支持H264-MP3-MP4功能体验,导出pdf和下载方法有变调整

最新版的支持H264版本(109.1.11,109.1.18)5154分支,也是win7/8/8.1最后一个支持版本 此贴仅分项版本变化和注意事项,本篇文章不提供dll编译文件,有需要单独联系,仅供学习参考 109版本体验测试(音频和视频功能),版本较100.0.230变化提醒及注意变更的内容。 上视频支…

C++每日一练:难题-大数加法

文章目录 前言一、题目二、代码及思路总结 前言 这题好像是指定了C&#xff0c;那就用C来做嘛&#xff0c;确实在C/C中一不小心就超出范围了&#xff0c;说实在的&#xff0c;C这个语言有时候真的很让人无语。很显然这是要用字符串来计算了。这题坑比较多&#xff0c;笔者这也…

数据库使用自增ID好还是UUID好?为什么?

数据库使用自增ID好还是UUID好&#xff1f;为什么&#xff1f; 答&#xff1a; 自增ID 优点&#xff1a; 数字类型&#xff0c;占用空间小数据库自动增量排序&#xff0c;对检索有利&#xff0c;读写速度快&#xff08;聚簇索引的优势&#xff09;系统编码过程中&#xff0…

知识推理学习笔记

OWL本体语言 基于RDF语法&#xff0c;最规范&#xff0c;最严谨&#xff0c;表达能力最强 一 语法 三元组 二 逻辑基础 描述逻辑&#xff1a;基于对象的知识表示的形式化&#xff0c;是一阶谓词逻辑的一个可判定子集 三 描述逻辑系统 一个描述逻辑包含4个基本组成部分 …

【Python数据存储】零基础也能轻松掌握的学习路线与参考资料

Python是一种高级编程语言&#xff0c;被广泛应用于数据科学中。数据存储是数据科学中至关重要的一环&#xff0c;因为人们需要将收集到的数据保存在一些地方。Python中的数据存储有很多种&#xff0c;因此在学习过程中需要明确自己的需求&#xff0c;掌握不同数据存储方式的优…

深入理解 python 虚拟机:多继承与 mro

深入理解 python 虚拟机&#xff1a;多继承与 mro 在本篇文章当中将主要给大家介绍 python 当中的多继承和 mro&#xff0c;通过介绍在多继承当中存在的问题就能够理解在 cpython 当中引入 c3 算法的原因了&#xff0c;从而能够帮助大家更好的了理解 mro 。 python 继承的问题…

【Linux】shell编程之—函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

十五、Gateway网关

目录 Zuul网关和gateway网关的区别&#xff1a; Gateway路由配置 1、新建服务网关项目&#xff0c;并在项目pom文件中引入gateway网关依赖 2、在application.yml配置gateway 3、如果不用配置的方式配置gateway路由&#xff0c;还可以通过代码的形式配置 4、启动网关服务&…

达梦:创建用户并授予用户只读权限

需求描述&#xff1a; 1.想创建一个用户&#xff0c;这用户能访问其他3个用户的资源&#xff0c;权限是只读&#xff0c;这种创用户的sql怎么写&#xff1f; 2.怎么修改用户密码呢&#xff1f; 环境&#xff1a; 通用机 一、创建用户并授权 1.创建业务用户步骤 step1:创建用户使…

短期光伏发电量短期预测(Python代码,基于LSTM模型)

一.代码流程&#xff08;运行视频&#xff1a;短期光伏发电量短期预测&#xff08;Python代码&#xff0c;基于LSTM模型&#xff09;_哔哩哔哩_bilibili&#xff09; 数据预处理&#xff1a; 读取CSV文件&#xff0c;并使用Pandas库将数据加载到DataFrame中。将时间列转换为日期…

PoseiSwap缘何成DEX赛道新宠?POSE价值分析

区块链技术以去中心化、伪匿名以及公开透明作为主要特点&#xff0c;虽然这种意识形态是具备先进性的&#xff0c;但以此为基础所带来的加密原生特性&#xff0c;也正在阻碍着链上世界的发展。作为一种透明、非许可的分布式网络&#xff0c;隐私与合规始终是现阶段&#xff0c;…

【AWK命令】

目录 一、awk的工作原理&#xff1a;二、命令演示1、按行输出文本2、按字段输出文本1、使用三元运算符 三、通过管道&#xff0c;双引号调用shell命令1、查看时间的命令2、getline 获取内容3、OFS输出分割符4、awk来排序数组 一、awk的工作原理&#xff1a; 1、逐行读取文本&a…

华为OD机试真题 Java 实现【日志采集系统】【2023Q1 100分】

一、题目描述 日志采集是运维系统的的核心组件。日志是按行生成&#xff0c;每行记做一条&#xff0c;由采集系统分批上报。 如果上报太频繁&#xff0c;会对服务端造成压力&#xff1b;如果上报太晚&#xff0c;会降低用户的体验&#xff1b;如果一次上报的条数太多&#xf…

MSQL系列(一) Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/B+Tree

Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/BTree 我们在项目中都会使用索引&#xff0c;所以我们要了解索引的存储结构&#xff0c;今天我们就着重讲解下Mysql的索引结构存储模型&#xff0c;并且看下 二叉树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B…

沉浸式翻译 – 沉浸式的阅读与学习双语的翻译工具

为何称为沉浸式呢 智能识别网页主内容区进行翻译&#xff0c;与同类插件翻译整个网页不同&#xff0c;降低对原网页的“侵入性”&#xff0c;提升阅读体验&#xff0c;因此得名“沉浸式翻译”。 受宠的缘由 自从谷歌翻译不再对大陆用户提供服务后。内心是一阵酸痛的&#xf…

ML之LoR:基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例

ML之LoR&#xff1a;基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例 目录 基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用…

网络安全35岁是新时代挑战?

前言 对于一个工作不下于4年的人来说&#xff0c;我觉得我有一定的思考沉淀来回答这个问题。 说说我的一些经历吧。 普通一本毕业&#xff0c;专业是自动化&#xff0c;大学由于挂科太多没拿到学位证到上海找实习&#xff0c;一开始做的是开发&#xff0c;从16年到19年都是做…

如何在线安装Axure插件?

当我们需要进行原型设计时&#xff0c;Axure 成为了专门为此而生的专业级设计产品&#xff0c;也是产品经理必备的工具之一。通过使用 Axure&#xff0c;设计人员可以更好地了解实际项目的实施方式&#xff0c;并与产品经理进行更有效的合作&#xff0c;以评估范围和技术可行性…