Linux文本三剑客(2)

文章目录

  • 一、Linux文本三剑客之awk
    • 使用方法
    • awk 的原理
      • 实例一:只查看test.txt文件(100行)内第20到第30行的内容(企业面试)
      • 实例二:已知test.txt文件内容为
    • BEGIN 和 END 模块
      • 实例一:统计/etc/passwd的账户人数
      • 实例二:统计某个文件夹下的文件占用的字节数
    • awk运算符
    • 常用 awk 内置变量
    • awk正则
    • awk 的 if、循环和数组
      • if
      • while
      • 数组
    • 常用字符串函数

一、Linux文本三剑客之awk

使用方法

awk '{pattern + action}' {filenames}

其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

awk 的原理

-F:指定分隔符

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

执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。
在这里插入图片描述

[root@localhost ~]# awk -F":" '{print $1}' /etc/passwd
[root@localhost ~]# awk -F":" '{print $1 $3}' /etc/passwd
[root@localhost ~]# awk -F":" '{print $1" " $3}' /etc/passwd
[root@localhost ~]# awk -F":" '{print "username:"$1"\t\tuid:" $3}' /etc/passwd

-F参数:指定分隔符,可指定一个或多个

print 后面做字符串的拼接

实例一:只查看test.txt文件(100行)内第20到第30行的内容(企业面试)

sed -n ‘20,30p’

[root@localhost ~]# seq 100 > test.txt
[root@localhost ~]# awk '{if(NR>=20 && NR<=30) print $1}' test.txt
20
21
22
23
24
25
26
27
28
29
30# nl /etc/passwd | tail -n +20 |head -n 10

实例二:已知test.txt文件内容为

[root@localhost ~]# cat test.txt
I am aaron, my qq is 1234567

请从该文件中过滤出’aaron’字符串与1234567,最后输出的结果为:aaron 1234567

[root@localhost ~]# awk -F '[ ,]+' '{print $3" "$8}' test.txt #用[]可以放多个分隔符
aaron 1234567
等效
[root@localhost ~]# awk -F ',' '{print $1" "$2}' test.txt|awk '{print $3 " " $7}'

BEGIN 和 END 模块

实例一:统计/etc/passwd的账户人数

awk 'BEGIN {count=0;print "[start] user count is ",count}{count++;print $0} END{print "[end] user count is ",count}' /etc/passwd

count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0

[root@localhost ~]# awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd

实例二:统计某个文件夹下的文件占用的字节数

[root@localhost ~]# ll | awk 'BEGIN {size=0} {size=size+$5} END{print "size is ",size}'
size is 1468
[root@localhost ~]# ll | awk 'BEGIN {size=0} {size=size+$5} END{print "size is ",size/1024/1024,"M"}'
size is 0.00139999 M

awk运算符

运算符描述
赋值运算符
= += -= *= /= %= ^= **=赋值语句
逻辑运算符
¦¦逻辑或
&&逻辑与
正则运算符
~ !~匹配正则表达式和不匹配正则表达式
关系运算符
< <= > >= != ==关系运算符
算数运算符
+ -加,减
* / &乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ –增加或减少,作为前缀或后缀
其他运算符
$字段引用
空格字符串链接符
?:三目运算符
ln数组中是否存在某键值

awk 赋值运算符:a+=5;等价于: a=a+5;其他同类

[root@node-1 ~]# awk 'BEGIN{a=5;a+=5;print a}'
10

awk逻辑运算符:判断表达式 a>2&&b>1为真还是为假,后面的表达式同理

[root@node-1 ~]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1

awk正则运算符:

[root@node-1 ~]# awk 'BEGIN{a="100testaa";if(a~/100/) {print "OK"}}'
OK

关系运算符:

如: > < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字 才转为数值比较。字符串比较:按照ascii码顺序比较。

[root@node-1 ~]# awk 'BEGIN{a="11";if(a>=9){print"OK"}}'
[root@node-1 ~]# awk 'BEGIN{a=11;if(a>=9){print"OK"}}'
OK
[root@node-1 ~]# awk 'BEGIN{a;if(a>=b){print"OK"}}'
OK

awk 算术运算符:

说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。

[root@node-1 ~]# awk 'BEGIN{a="b";print a++,++a}'
0 2
[root@node-1 ~]# awk 'BEGIN{a="20b4";print a++,++a}'
20 22

这里的a++ , ++a与javascript语言一样:a++是先赋值加++;++a是先++再赋值

三目运算符 ?:

[root@node-1 ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[root@node-1 ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err

常用 awk 内置变量

变量名属性
$0当前记录
$1~ $n当前记录的第n个字段
FS输入字段分割符 默认是空格
RS输入记录分割符 默认为换行符
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始
OFS输出字段分割符 默认也是空格
ORS输出的记录分割符 默认为换行符

注:内置变量很多,参阅相关资料

字段分隔符 FS

FS=“\t” 一个或多个 Tab 分隔

[root@node-1 ~]# cat tab.txt
aa bb cc
[root@node-1 ~]# awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt
aa bb cc

FS=“[[:space:]+]” 一个或多个空白空格,默认的,匹配到不符合的就停止

[root@node-1 ~]# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' tab.txt
aa bb cc
[root@node-1 ~]# awk -F [[:space:]+] '{print $1,$2}' tab.txt
aa bb

FS=“[” “:]+” 以一个或多个空格或:分隔

[root@node-1 ~]# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt
root x 0

字段数量 NF :显示满足用:分割,并且有8个字段的

[root@node-1 ~]# awk -F ":" 'NF==8{print $0}' hello.txt
bin:x:1:1:bin:/bin:/sbin/nologin:888

记录数量 NR

[root@node-1 ~]# ifconfig br0 | awk -F [" ":]+ 'NR==2{print $3}'
192.168.0.241

RS 记录分隔符变量

将 FS 设置成"\n"告诉 awk 每个字段都占据一行。通过将 RS 设置成"",还会告诉 awk每个地址记录都由空白行分隔。

[root@node-1 ~]# cat awk.txt
#!/bin/awk
BEGIN {FS="\n"RS=""
}
{print $1","$2","$3
}
[root@node-1 ~]# awk -f awk.txt recode.txt

在""分割符之内,符合\n分割的会被打印出来

OFS 输出字段分隔符

[root@node-1 ~]# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt
root#x#0
bin#x#1

ORS 输出记录分隔符

[root@node-1 ~]# cat awk.txt
#!/bin/awk
BEGIN {FS="\n"RS=""ORS="\n\n"
}
{print $1","$2","$3
}
[root@node-1 ~]# awk -f awk.txt recode.txt
Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456Big Tony,200 Incognito Ave.,Suburbia,WA 64890

awk正则

元字符功能示例解释
^首航定位符/^root/匹配所有以root开头的行
|行尾定位符|/root/匹配所有以root结尾的行
.匹配任意单个字符/r…t/匹配字母r,然后两个任意字符,再以t结尾的行
*匹配0个或多个前导字符(包括回车)/a*ool/匹配0个或多个a之后紧跟着ool的行,比如ool,aaaaool等
+匹配1个或多个前导字符/a+b/ab, aaab
?匹配0个或1个前导字符/a?b/b,ab
[]匹配指定字符组内的任意一个字符/1/匹配以a或b或c开头的行
[^]匹配不在指定字符组内任意一个字符/[abc]/匹配不以字母a或b或c开头的行
()子表达式组合/(rool)+/表示一个或多个rool组合,当有一些字符需要组合时,使用括号括起来
¦或者的意思/(root)\¦B/匹配root或者B的行
\转义字符/a///匹配a//
,!匹配,不匹配的条件语句$1~/root/匹配第一个字段包含字符root的所有记录
x{m}x{m,}x{m,n}x重复m次x重复至少m次x重复至少m次,但是不超过n次/(root){3}//(root){3,}//(root){3,6}/

正则应用

规则表达式

awk '/REG/{action} ' file ,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action进行处理

[root@node-1 ~]# awk '/root/{print$0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@node-1 ~]# awk -F ":" '$5~/root/{print$0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@node-1 ~]# ifconfig br0 | awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print$3}'
192.168.0.241

布尔表达式

awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块。

[root@node-1 ~]# awk -F: '$1=="root"{print$0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@node-1 ~]# awk -F: '($1=="root")&&($5=="root"){print$0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

awk 的 if、循环和数组

if

条件语句

awk 提供了非常好的类似于 C 语言的 if 语句。

{if ($1=="foo"){if ($2=="foo"){print"uno"}else{print"one"}}elseif($1=="bar"){print "two"}else{print"three"}
}

使用 if 语句还可以将代码:

! /matchme/ { print $1 $3 $4 }

转换成:

{if ( $0 !~ /matchme/ ) {print $1 $3 $4}
}

while

循环结构

我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。 awk 还有"do…while"循环,它在代码块结尾处对条件求值,而不像标准 while 循环那样在开始处求值。

它类似于其它语言中的"repeat…until"循环。以下是一个示例:

do…while 示例

{count=1do {print "I get printed at least once no matter what"} while ( count !=1 )
}

与一般的 while 循环不同,由于在代码块之后对条件求值, "do…while"循环永远都至少执行一次。换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。

for 循环

awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:

for ( initial assignment; comparison; increment ) {code block
}

以下是一个简短示例:

for ( x=1;x<=4;x++ ) {print "iteration", x
}

break 和 continue

此外,如同 C 语言一样, awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。

#!/bin/awk
BEGIN{
x=1
while(1) {print "iteration",xif ( x==10 ){break}x++}
}

continue 语句补充了 break

x=1
while (1) {if ( x==4 ) {x++continue}print "iteration", xif ( x>20 ) {break}x++
}

continue在for中使用

#!/bin/awk
BEGIN{
for (x=1;x<=21;x++){
if (x==4){continue
}print "iteration",x
}
}

数组

AWK 中的数组都是关联数组,数字索引也会转变为字符串索引

在awk中,数组叫关联数组,与我们在其它编程语言中的数组有很大的区别。关联数组,简单来说,类似于python语言中的dict、java语言中的map,其下标不再局限于数值型,而可以是字符串,即下标为key,value=array[key]。竟然为key,那其下标也不再是有序的啦。

#!/bin/awk
BEGIN{cities[1]="beijing"cities[2]="shanghai"cities["three"]="guangzhou"for( c in cities) {print cities[c]}print cities[1]print cities["1"]print cities["three"]
}

用 awk 中查看服务器连接状态并汇总

[root@node-1 ~]# netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print
a,s[a]}'
LISTEN 8
ESTABLISHED 1

常用字符串函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符串函数的应用

在 info 中查找满足正则表达式, /[0-9]+/ 用”!”替换,并且替换后的值,赋值给 info

[root@node-1 ~]# awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' 
this is a test!test!

如果查找到数字则匹配成功返回 ok,否则失败,返回未找到

[root@node-1 ~]# awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok

从第 4 个 字符开始,截取 10 个长度字符串

[root@node-1 ~]# awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes

分割 info,动态创建数组 tA,awk for …in 循环,是一个无序的循环。 并不是从数组下标1…n 开始

[root@node-1 ~]# awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a

  1. abc ↩︎

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

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

相关文章

直播app开发,技术驱动的实时互动新纪元

随着互联网技术的快速发展&#xff0c;直播已成为我们日常生活的重要组成部分。从娱乐、教育到商业活动&#xff0c;直播的广泛应用正在改变着我们的生活和工作方式。在这一变革中&#xff0c;直播开发扮演着至关重要的角色。本文将探讨直播开发的核心理念、技术挑战以及未来的…

零售行业供应商数据分发,怎样提高安全性和效率?

零售行业是我国经济发展的重要组成&#xff0c;零售行业包罗万象&#xff0c;如包括汽车零售、日化零售、快消品零售等&#xff0c;不同细分行业的运营模式各不相同&#xff0c;但大体来说&#xff0c;零售行业都具备最基础的供应商和零售商&#xff0c;供应商将商品或服务卖给…

C++学习Day04之单例模式

目录 一、程序及输出1.1 饿汉式实例1.2 饿汉式单例1.3 懒汉式单例1.4 线程安全的懒汉式单例 二、分析与总结 一、程序及输出 1.1 饿汉式实例 #include<iostream> using namespace std; #include <string> class Printer { public:static Printer * getInstance()…

flinkcdc 3.0 源码学习之任务提交脚本flink-cdc.sh

大道至简,用简单的话来描述复杂的事,我是Antgeek,欢迎阅读. 在flink 3.0版本中,我们仅通过一个简单yaml文件就可以配置出一个复杂的数据同步任务, 然后再来一句 bash bin/flink-cdc.sh mysql-to-doris.yaml 就可以将任务提交, 本文就是来探索一下这个shell脚本,主要是研究如何通…

116.乐理基础-五线谱-音值组合法(一)

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;115.乐理基础-五线谱-五线谱的练习方式-CSDN博客 音值组合法有点鸡肋&#xff0c;有两个原因 1. 它的本质只是为了让乐谱里的音符&#xff0c;在外观上组合得更加方便我们去看谱&#xff0c;并不涉及到什么很重要很…

开源版发卡小程序源码,云盘发卡微信小程序源码带PC端

一款发卡小程序。带PC端 系统微信小程序前端采用nuiapp 后端采用think PHP6 PC前端采用vue开发 使用HBuilderX工具打开&#xff0c;运行到微信小程序工具&#xff0c;系统会自动打包微信小程序代码 修改文件common/request/request.js 改成你的后端网址 微信小程序端完全…

猫头虎分享已解决Bug || Docker Error: Request Canceled While Waiting for Connection

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Java图形化界面编程——弹球游戏 笔记

Java也可用于开发一些动画。所谓动画&#xff0c;就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像&#xff0c;两次绘制的图像之间差异较小&#xff0c;肉眼看起来就成了所谓的动画 。 ​ 为了实现间隔一定的时间就重新调用组件的 repaint()方法&#xff0c;可以借助于…

怎么用postman调用webservice(反推SoapUI)

<soapenv:Envelope xmlns:soapenv“http://schemas.xmlsoap.org/soap/envelope/” xmlns:lis“LisDataTrasen”> soapenv:Header/ soapenv:Body lis:Test lis:test111111111</lis:test> </lis:Test> </soapenv:Body> </soapenv:Envelope> Conten…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

智能时代:创新创业的新机遇与挑战

智能时代为创新创业提供了广阔的空间和无限的可能性。以下是一些可能适合智能时代背景的创新创业方向&#xff1a; 人工智能技术应用&#xff1a;人工智能技术是当前科技领域最热门的技术之一&#xff0c;其应用范围不断扩大。创业者可以将人工智能技术应用于各个领域&#xf…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;一个Vue实例从 创建…

OnlyOffice-8.0版本深度测评

OnlyOffice 是一套全面的开源办公协作软件&#xff0c;不断演进的 OnlyOffice 8.0 版本为用户带来了一系列引人瞩目的新特性和功能改进。OnlyOffice 8.0 版本在功能丰富性、安全性和用户友好性上都有显著提升&#xff0c;为用户提供了更为强大、便捷和安全的文档处理和协作环境…

C#,最大公共子序列(LCS,Longest Common Subsequences)的算法与源代码

1 最大公共子序列 最长的常见子序列问题是寻找两个给定字符串中存在的最长序列。 最大公共子序列算法&#xff0c;常用于犯罪鉴定、亲子鉴定等等的 DNA 比对。 1.1 子序列 让我们考虑一个序列S<s1&#xff0c;s2&#xff0c;s3&#xff0c;s4&#xff0c;…&#xff0c;…

node.js+vue企业人事自动化办公oa系统c288a

采用B/S模式架构系统&#xff0c;开发简单&#xff0c;只需要连接网络即可登录本系统&#xff0c;不需要安装任何客户端。开发工具采用VSCode&#xff0c;前端采用VueElementUI&#xff0c;后端采用Node.js&#xff0c;数据库采用MySQL。 涉及的技术栈 1&#xff09; 前台页面…

STM32单片机的基本原理与应用(七)

超声波测距实验 基本原理 超声波测距实验是STM32单片机通过控制HC-SR04超声波模块&#xff0c;使其发送超声波&#xff0c;遇到物体反射回超声波来实现距离测量&#xff0c;其原理就是在发射超声波到接收超声波会有一段时间&#xff0c;而超声波在空气中传播的速度为声速&…

uv机器电机方向极性

爱普生主板设置X、Y 电机方向极性&#xff1a;请根据实际情况设置&#xff0c;开机初始化时如果电机运动方向反了则修改此极性。 理光主板设置X、Y 电机方向极性

《乱弹篇(十三)明朝事儿》

2024年农历除夕夜&#xff0c;因追剧收看电视连续剧《后宫》而放弃了收看一年一度的《春晚》&#xff0c;至到春节&#xff08;农历正月初一&#xff09;晚才看完了《后宫》。 社交网站“必应”图片《后宫》 电视连续剧《后宫》&#xff0c; 讲的是明朝英宗末年的历史故事&…

渗透专用虚拟机(公开版)

0x01 工具介绍 okfafu渗透虚拟机公开版。解压密码&#xff1a;Mrl64Miku&#xff0c;压缩包大小&#xff1a;15.5G&#xff0c;解压后大小&#xff1a;16.5G。安装的软件已分类并在桌面中体现&#xff0c;也可以使用everything进行查找。包含一些常用的渗透工具以及一些基本工…

2.10日学习打卡----初学RocketMQ(一)

2.10日学习打卡 对于MQ(Message queue)消息队列的一些解释可以看我原来写的文章 初学RabbitMQ 各大MQ产品比较 一.RocketMQ概述 发展历程 RocketMQ概念术语 生产者和消费者 生产者负责生产消息&#xff0c;一般由业务系统负责生产消息&#xff0c;消费者即后台系统&…