13.shell awk基础

13.shell awk基础

          • awk作用
          • awk语法结构
          • awk脚本结构
          • awk工作原理
          • awk内部变量
          • awk格式输出
          • awk模式匹配
            • RegExp示例
            • 运算符匹配示例
            • 布尔运算符匹配示例
            • 运算符匹配示例
          • awk条件判断
            • if判断
          • awk循环语句
            • while循环
            • for循环

awk是一种强大的文本处理工具,主要用于对文本和数据进行处理。

awk作用
awk命令擅长对文件列进行操作 (awk在识别列信息的时候,默认以空格为分隔符,来识别列信息的)
awk命令擅长对数据文件进行分析
awk命令可以编写脚本
awk可以进行算术运算

awk语法结构
awk options 'pattern {action}' file
awk 选项     '模式{动作}'        文件

options:是一些选项,用于控制 awk 的行为。

-F : 指定输入字段的分隔符,默认是空格。使用这个选项可以指定不同于默认分隔符的字段分隔符。
-v  :设置 awk 内部的变量值。可以使用该选项将值传递给 awk 脚本中的变量。
-f : 指定一个包含 awk 脚本的文件。这样可以在文件中编写较大的 awk 脚本,然后使用 -f 将其加载。

pattern:是用于匹配输入数据的模式。如果省略,则 awk 将对所有行进行操作。
{action}:是在匹配到模式的行上执行的动作。如果省略,则默认动作是打印整行。


awk 'BEGIN {命令} pattern {命令} END {命令}' 文件

BEGIN:处理文件前执行的动作
END:处理文件后执行的动作
pattern:模式,每一行都执行的动作
BEGIN和END里的命令只是执行一次,pattern里的命令会匹配每一行去处理


awk脚本结构
vim test.awk

#处理文件前执行的动作
BEGIN {
    printf "--------\n"  #这里面放的是执行前的语句
}
#处理文件的过程中
{    
    printf "----------\n" #这里面放的是处理每一行时要执行的语句
}
#文件处理完后执行的动作
END {
    printf "-----------\n" #这里面放的是处理完所有的行后要执行的语句
}

脚本执行

awk -f test.awk 要处理的文件

awk工作原理

逐行读取信息
判断是否为需要的信息
如果是满足条件的信息,就对满足条件的信息做相应的处理
如果不是满足条件的信息,就会继续读取下一行信息

以该命令为例: awk -F: ‘{print $1,$3}’ /etc/passwd

  1.awk将文件中的每一行作为输入, 并将每一行赋给内部变量$0, 以换行符结束 
  2.awk开始进行字段分解,每个字段存储在已编号的变量中,从$1开始[默认空格分割] 
  3.awk默认字段分隔符是由内部FS变量来确定, 可以使用-F修订 
  4.awk行处理时使用了print函数打印分割后的字段 
  5.awk在打印后的字段加上空格,因为$1,$3 之间有一个逗号。逗号被映射至OFS内部变量中,称为输出字段分隔符, OFS默认为空格. 
  6.awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕.

在这里插入图片描述


awk内部变量
内置变量含义
$0整行内容
$1-$n当前行的第1-n个字段
NF当前行的字段个数,也就是多少列
NR当前的行号,从1开始计数
FS输入字段分隔符。不指定默认以空格或tab键分割
RS输入行分隔符。默认回车换行
OFS输出字段分隔符。默认为空格
ORS输出行分隔符。默认为回车换行

测试文件准备

cat awk_test.txt

ll 1990 50 51 61
kk 1991 60 52 62
hh 1992 70 53 63
jj 1993 80 54 64
mm 1994 90 55 65

1.awk内置变量,$0保存当前记录的内容
awk '{print $0}' awk_test.txt
在这里插入图片描述

2.awk内置变量,FS指定字段分割符,默认以空白行作为分隔符
awk '{print $1}' awk_test.txt
在这里插入图片描述

FS指定字段分割符
awk -F '[: ]+' '{print $1}' awk_test.txt
在这里插入图片描述

3.awk内置变量NF,保存每行的最后一列
awk '{print NF,$NF}' awk_test.txt
打印NF和$NF
NF 当前行有多少列
$NF 最后一列内容
在这里插入图片描述

4.awk内置变量NR,表示记录行号。
awk '{print NR,$0}' awk_test.txt
在这里插入图片描述

如果想打印第二行到第三行的内容怎么办?
awk 'NR>1&&NR<4 {print NR,$0}' awk_test.txt
在这里插入图片描述

如果既想打印第三行,又想打印第一列?
awk 'NR==3 {print $1}' awk_test.txt
在这里插入图片描述

5.awk内置变量RS,输入行分隔符。
awk 'BEGIN{RS="--"} {print $0}' awk-test.txt
默认以换行为行分隔符,这里指定了 ‘–’ 为行分隔符,原本一行的内容,分为了三行。
在这里插入图片描述

6.awk内置变量,“OFS输出字段分隔符”,初始情况下OFS变量是空格。
awk 'BEGIN{RS="--";FS="|";OFS=": "} {print $1,$2}' awk-test.txt
以–为行分隔符,以|为输入字段分隔符,输出的内容将以:为分隔符展示
在这里插入图片描述

7.awk内置变量,“ORS输出行分隔符”,默认行分割符为\n
awk 'BEGIN{RS="--";FS="|";OFS=": ";ORS="*****"} {print $1,$3}' awk-test.txt
在这里插入图片描述


awk格式输出

awk可以通过printf函数生成非常漂亮的数据报表。

格式符含义
%s打印字符串
%d打印十进制数(整数)
%f打印一个浮点数(小数)
%x打印十六进制数
修饰符含义
-左对齐
+右对齐

printf默认没有分隔符,输出是一坨

awk 'BEGIN{FS=":"} {printf $1}' passwd

在这里插入图片描述

2.加入换行,格式化输出。
awk 'BEGIN{FS=":"} {printf "%s\n",$1}' passwd
在这里插入图片描述

3.使用占位符美化输出。
awk 'BEGIN{FS=":"} {printf "%20s %20s\n",$1,$7}' passwd
在这里插入图片描述

4.默认右对齐,-表示左对齐。
awk -F":" '{printf "%-20s %-20s\n",$1,$7}' passwd
在这里插入图片描述


zhangsan	80	90	82	75
lisi		91	76	97	98
wangwu		86	98	89	97
oldsix		87	99	78	99
sun			76	96	85	69
BEGIN { #行处理前
	printf "%-20s %-20s %-20s %-20s %-20s \n",
	"Name","Chinese","Math","PE","Engilsh"
}
{ #行处理中
	printf "%-20s %-20s %-20s %-20s %-20s \n",
	$1,$2,$3,$4,$5
}

在这里插入图片描述


awk模式匹配

awk第一种模式匹配:RegExp
awk第二种模式匹配:关系运算匹配

RegExp示例

1.匹配/etc/passwd文件行中含有root字符串的所有行。
awk -F":" '/root/{print $0}' passwd

在这里插入图片描述

2.匹配/etc/passwd文件行中以root开头的行。
awk '/^root/' passwd
在这里插入图片描述

3.匹配/etc/passwd文件行中/bin/bash结尾的行。
awk '/\/bin\/bash$/' passwd
在这里插入图片描述


运算符匹配示例
符号含义
<小于
>大于
<=小于等于
>=大于等于
==等于
!=不等于
~匹配正则表达式
!~不匹配正则表达式

1、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息
awk -F":" '$3<50{print $0}' passwd
在这里插入图片描述

2、以:为分隔符,匹配/etc/passwd文件中第7个字段为/bin/bash的所有行信息
awk -F":" '$7=="/bin/bash" {print $0}' passwd
在这里插入图片描述

3、以:为分隔符,匹配/etc/passwd文件中第7个字段不为/bin/bash的所有行信息
awk -F":" '$7!="/bin/bash" {print $0}' passwd
在这里插入图片描述

4、以:为分隔符,匹配/etc/passwd文件中第3个字段包含3个数字以上的所有行信息
awk -F":" '$3~/[0-9]{3,}/{print $0}' passwd
在这里插入图片描述


布尔运算符匹配示例
符号含义
||
&&

1、以:为分隔符,匹配passwd文件中包含ftp或mail的所有行信息
awk -F":" '/ftp/||/mail {print $0}/' passwd
在这里插入图片描述

2、以:为分隔符,匹配passwd文件中第3个字段小于50并且第4个字段大于50的所有行信息
awk -F":" '$3<50&&$4>50 {print $0}' passwd
在这里插入图片描述
3.匹配没有/sbin/nologin的行。
awk -F":" '$0 !~ /\/sbin\/nologin$/ {print $0}' passwd
在这里插入图片描述


运算符匹配示例
运算符han yi
+
-
*
/
%模(取余)

1、计算学科平均分数

zhangsan	80	90	82	75
lisi		91	76	97	98
wangwu		86	98	89	97
oldsix		87	99	78	99
sun			76	96	85	69

vim grades.awk

BEGIN {
	printf "%-20s %-20s %-20s %-20s %-20s %-20s \n",
	"Name","Chinese","Math","PE","Engilsh","AVG"
}
{
	sum=$2+$3+$4+$5
	avg=sum/(NF-1)
}

{
	printf "%-20s %-20s %-20s %-20s %-20s %-20s \n",
	$1,$2,$3,$4,$5,avg
}

awk -f grades.awk grades.txt

在这里插入图片描述

核对一下平均分
echo " 80 90 82 75" |xargs |sed 's# #+#g'|bc

在这里插入图片描述
在这里插入图片描述


awk条件判断
if判断

if语句格式:{if(表达式) {语句;语句;....}}

1.以:为分隔符,打印当前管理员用户名称
在这里插入图片描述

BEGIN {
	FS=":"
}
{
	if($3==0){
		print $1,"is administrator"
		}
}

2.以:为分隔符,统计系统用户数量
在这里插入图片描述

BEGIN{ #行处理前
	FS=":"
}
{ #行处理中
	if($3>0 && $3<1000){
		i++
	}
}
END{ #行处理后
	print "系统用户数量为:"i
}

3.以:为分隔符,统计普通用户数量
在这里插入图片描述

BEGIN{
	FS=":"
}
{
	if($3>1000){
		i++
	}
}
END{
	print "普通用户数量为:"i
}

4.以:为分隔符,只打印passwd中第3个字段的数值在50-100范围内的行信息
awk 'BEGIN{FS=":"}{if($3>50 && $3<100){print $0}}' passwd

在这里插入图片描述

BEGIN{
	FS=":"
}
{
	if ($3>50 && $3<100){
		print $0
	}
}

日常使用中更推荐awk脚本的形式,方便阅读,可持续使用,命令行的形式无法重复使用。


if...else语句格式:{if(表达式) {语句;语句;...} else{语句;语句;...}}

1.以:为分隔符,判断第三列如果等于0,则打印该用户名称,如果不等于0则打印第七列。

awk 'BEGIN{FS=":"}{if($3==0){print $1}else{print $7}}' passwd

BEGIN{
	FS=":"
}
{
	if($3==0){
		print $1
	}
	else{
		print $7
	}
}

在这里插入图片描述

2、以:为分隔符、判断第三列如果等于0,则打印管理员出现的个数,否则都视为系统用户,并打印它的个数。

awk 'BEGIN{FS=":";OFS="\n"} {if($3==0){i++} else{j++}} END{print i "管理员",j "系统用户" }' passwd

BEGIN{
	FS=":"
	OFS="\n"
}
{
	if($3==0){
	i++
	}
	else{
	j++
	}
}
END{
	print  i "管理员",j "系统用户"
}

在这里插入图片描述


if...else语句格式:{if(表达式1) {语句;语句;...} else if(表达式2){语句;语句;...} else{语句;语句;...}}

1.使用awk 打印出当前/etc/passwd文件管理员有多少个,系统用户有多少个,普通用户有多少个

BEGIN{
	FS=":"
	OFS="\n"
}
{
	if($3==0){
	i++
	}
	else if($3>0 && $3<1000 ){
	j++
	}
	else {
	k++
	}
}
END{
	print  i "管理员",j "系统用户",k "普通用户"
}

在这里插入图片描述


2.打印/etc/passwd文件中UID小于50的、或者UID大于50小于100、或者UID大于100的用户名以及UID。

在这里插入图片描述
在这里插入图片描述

BEGIN{
	FS=":"
	printf "%-20s %-20s %-20s \n","UID区间","用户名","UID"
}
{
	if($3<50){
	i++
	 printf "%-20s %-20s %-20s \n","UID<50",$1,$3
	}
	else if($3>50&&$3<100){
	j++
	 printf "%-20s %-20s %-20s \n","50<UID<100",$1,$3
	}
	else {
	k++
	printf "%-20s %-20s %-20s \n","100<UID",$1,$3
	}
}
END{

	print "UID<50 :"i,"50<UID<100 :"j,"100<UID :"k
}


awk循环语句
while循环

while (条件表达式)动作

1.打印1-9

awk 'BEGIN{i=1;while(i<10){print i;i++}}'

在这里插入图片描述

2.打印passwd文件的每一行中的每一列

 awk -F":" '{i=1;while(i<=NF){print $i;i++}}' passwd

在这里插入图片描述


for循环

for(初始化计数器;计数器测试;计数器变更)动作

1.遍历1-4

awk 'BEGIN{for(i=1;i<5;i++){print i}}'

在这里插入图片描述

2.每行打印10次

awk -F":" '{for(i=1;i<=10;i++){print $0}}' passwd

在这里插入图片描述

3.打印每一行每一列

awk -F":" '{for(i=1;i<=NF;i++){print $i}}' passwd

在这里插入图片描述

4.计算1+2+3+4+…+100的和,请使用while、for两种循环方式实现

shell

#!/bin/bash

for i in {1..100}
do
	sum=$[$sum+$i]   #或 let sum+=i
done
	echo $sum

在这里插入图片描述


while循环:
awk 'BEGIN{i=1;while(i<=100){sum+=i;i++} {print sum}}'

BEGIN{
	while (i<=100){
	sum+=i
	i++
	}
	print sum
}

在这里插入图片描述


for循环:
awk 'BEGIN{for(i=1;i<=100;i++){sum+=i}print sum}'

BEGIN{
	for(i=1;i<=100;i++){
		sum+=i
	}
		print sum
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。

有可能是端口冲突 netstat -ano | findstr :3306运行这段代码出现类似&#xff1a; 可以看到端口 3306 已经被进程 ID 为 6284 的进程占用。为了启动新的 MySQL 服务&#xff0c;我们需要停止这个进程或更改新服务的端口&#xff1a; 1、终止进程 taskkill /PID 6284 /F2、确…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

在矩池云使用GLM-4的详细指南(无感连GitHubHuggingFace)

GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本&#xff0c;在多项测试中表现出超越已有同等规模开源模型的性能&#xff0c;它能兼顾多轮对话、网页浏览、代码执行、多语言、长文本推理等多种功能&#xff0c;性能更加强大。其多模态语言模型GLM-4V-9B在…

Autohotkey使用记录

文章目录 1. 安装1.1 autohotkey1.2 vscode需要安装的插件 3. 函数使用3.1 按键3.2 MouseMove 4. Bug分析4.1 A_TimeSincePriorHotkey 1. 安装 1.1 autohotkey 下载安装即可 1.2 vscode需要安装的插件 3. 函数使用 3.1 按键 各个按键的代词使用关键字搜索&#xff1a;Hotk…

antd Pagination分页组件自定义跳转文案、按钮的方法【配置组件自带api即可支持】

组件默认效果&#xff1a; 期望效果&#xff1a; 代码&#xff1a; <PaginationclassNamelist-pagerpageSize{10}current{params?.pageNo}responsivetotal{listData?.totalItem}showSizeChanger{false}showQuickJumper{{ goButton: <Button classNamego-page>确定…

一、时钟控制

时钟 STM32F4有五种时钟源 HSI 内部高速时钟LSI 内部低速时钟HSE 外部高速时钟LSE 外部低速时钟PLL 锁相环倍频输出 其中 HSI、HSE、PLL可驱动系统时钟 (SYSCLK)&#xff0c;对于每个时钟源来说&#xff0c;在未使用时都可单独打开或者关闭&#xff0c;以降低功耗。 HSE高速…

计算机信息安全技术课后习题答案

计算机信息安全技术课后习题答案 计算机信息安全技术&#xff08;第2版&#xff09;付永刚 部分习题答案 第一章 计算机信息安全技术概述 选择题 关于访问控制服务的描述中&#xff0c;正确的是&#xff08; A &#xff09; A. 可控制用户访问网络资源 B.可识别发送方的真实身…

多用户竞拍商城系统 挂售转卖竞拍商城系统源码 竞拍系统 竞拍系统开发定制 转拍闪拍系统 后端PHP+前端UNIAPP源码+教程

挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP前端UNIAPP源码 玩法简介 ①、后台可添加商品进行挂单 ②、后台设置场次以及场次开始时间 ③、用户抢单 ④、抢单以后可选择提货或者转售 ⑤、玩家寄售需按照后台设置百分比进行加价 ⑥、玩家寄售需支付手续费(余额支付…

u盘数据要在哪台电脑上恢复?u盘数据恢复后保存在哪里

在数字化时代&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;由于各种原因&#xff0c;U盘中的数据可能会意外丢失&#xff0c;这时数据恢复就显得尤为重要。但是&#xff0c;很多人对于在哪台电脑上进行U盘数据恢复以及恢复后的数据应保存在哪里…

【Ardiuno】实验ESP32单片机完成搭建简易Web服务器功能(图文)

今天&#xff0c;小飞鱼继续来测试使用ESP32来实现简易的wifi无线web服务器功能。使用Ardiuno平台编辑器输入以下示例代码&#xff1a; #include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include <ESPmDNS.h>const char* ssid &q…

【UE5|水文章】在UMG上显示帧率

参考视频&#xff1a; https://www.youtube.com/watch?vH_NdvImlI68 蓝图&#xff1a;

50.Python-web框架-Django中引入静态的bootstrap样式

目录 Bootstrap 官网 特性 下载 在线样例 Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 在django中使用bootstrap 新建static\bootstrap5目录&#xff0c;解压后的Bootstrap文件&#xff0c;拷贝项目里就好。 在template文件里引用css文…

全华人团队推出多模态大模型新基准,GPT-4o准确率仅为65.5%,所有模型最易犯感知错误

GPT-4o再次掀起多模态大模型的浪潮。 如果他们能以近似人类的熟练程度&#xff0c;在不同领域执行广泛的任务&#xff0c;这对许多领域带来革命性进展。 因而&#xff0c;构建一个全面的评估基准测试就显得格外重要。然而评估大型视觉语言模型能力的进程显著落后于它们自身的…

Windows7及以上系统中管理员权限与UAC虚拟化详解(附源码)

目录 1、管理员权限 2、UAC虚拟化 3、将程序配置为以管理员权限启动 4、判断程序有没有管理员权限 5、以管理员权限启动目标程序 6、开机自启动程序不能设置管理员权限 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/art…

Samtec技术前沿 | 高达128 GT/s :全新概念验证型高速电缆解决方案性能

【摘要/前言】 即将发布的PCIe 7.0 规范旨在实现128 GT/s的数据传输速率。它延续了PCIe 每一代产品速度翻番的趋势。根据 PCI-SIG的说法&#xff0c;"PCIe 7.0 技术的目标是为人工智能/机器学习、数据中心、高性能计算、汽车和物联网等数据密集型市场提供可扩展的互连解决…

Docker笔记-Debian容器内搭建ssh服务

登陆容器之后修改密码&#xff1a; passwd 密码设置完成后安装openssh-server apt-get install openssh-server 修改端口号为50022并添加配置 vim /etc/ssh/sshd_config 修改成 Port 50022 PasswordAuthentication yes PermitRootLogin yes 启动 rootlinux:~# /etc/in…

实现AI口语练习的技术库

国内实现AI口语练习的第三方技术库比较多&#xff0c;以下是一些国内实现AI口语练习的第三方技术库。开发人员可以根据自己的需求选择合适的技术库进行开发。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 讯飞开放平台&#xff1a; …

2024世界人工智能大会“SAIL奖”发布

作为世界人工智能大会的最高奖项&#xff0c;SAIL 奖&#xff08;Super AI Leader&#xff0c;卓越人工智能引领者&#xff09;坚持“追求卓越、引领未来”的理念&#xff0c;评选和运营秉持“高端化、国际化、专业化、市场化、智能化”原则&#xff0c;从全球范围发掘在人工智…

【SpringBoot+Vue】后端代码使用Mybatis实现自动生成实体类的功能

参考】 SpringBoot多环境配置详解(application-dev.yml、application-test.yml、application-prod.yml) springboot集成mybatis【使用generatorConfig.xml配置自动生成代码】 怎么快速查看自己mysql的安装位置 解决 http://mybatis.org/dtd/mybatis-generator-config_1_0.dt…

Source Insight 4.0软件使用记录

目录 工程创建 个人使用 Source Insight 4.0 软件的一些记录。 工程创建 建议起名和自己工程名相同&#xff0c;不能有中文&#xff0c;否则一定会出错 这一步直接点ok即可&#xff1a; 添加所有文件 勾上&#xff1a; 随后便可在右边&#xff0c;打开文件进行阅读