shell-awk语法整理

shell-awk语法整理

  • 前言
  • 基本语法
  • 内置变量
    • 1. $0
    • 2. NF
    • 3. NR
    • 4. FS
    • 5. RS
    • 6. OFS
    • 7. ORS
    • 8. FILENAME
    • 9. FNR
    • 10. ARGV
    • 11. ENVIRON
    • 12. IGNORECASE
    • 13. RSTART 和 RLENGTH
    • 示例解释
  • 内置函数
  • 循环语句(后面的';'可不加)
  • 条件语句
  • 高级特性
    • 示例
  • 特殊模式
    • BEGIN
    • END
    • 组合示例
    • BEGINFILE 和 ENDFILE
    • getline 模式
    • 总结
  • 常用命令行选项

前言

AWK是一种功能强大的文本处理工具,可根据指定的规则对文本和数据文件进行逐行处理,通过灵活使用模式和动作的组合,可以实现复杂的文本分析和数据处理任务,适合处理各种格式的文本文件和数据流

基本语法

AWK的基本语法结构为:

awk pattern '{ action }' filename
  • pattern:用来匹配输入数据的模式
  • action:在匹配到符合模式的行时执行的操作
  • filename:要操作的目标文件

例如,要打印每行以字母 “a” 开头的文本:

awk '/^a/ { print }' filename

其中,/^a/ 是模式,{ print } 是操作,会打印文件中所有以字母 “a” 开头的行

内置变量

AWK 提供了许多内置变量,用于获取关于输入数据、当前行、行号等信息

1. $0

  • 描述:代表当前行的内容
  • 示例:打印所有行的内容(print后面什么都不带,也是一样的效果)
awk '{ print $0 }' filename

2. NF

  • 描述:代表当前行的字段数
  • 示例:打印每行的字段数
awk '{ print NF }' filename

3. NR

  • 描述:代表当前行的行号
  • 示例:打印每行的行号和内容
awk '{ print NR, $0 }' filename

4. FS

  • 描述:代表字段分隔符,默认是空白字符
  • 示例:使用不同的字段分隔符打印字段内容
awk -F':' '{ print $1, $2 }' filename

5. RS

  • 描述:代表记录分隔符,默认是换行符
  • 示例:按不同的记录分隔符处理数据
awk 'BEGIN { RS="@" } { print $0 }' filename

6. OFS

  • 描述:代表输出字段分隔符
  • 示例:设置不同的输出字段分隔符
awk 'BEGIN { OFS=" | " } { print $1, $2 }' filename

7. ORS

  • 描述:代表输出记录分隔符
  • 示例:设置不同的输出记录分隔符
awk 'BEGIN { ORS="\n\n" } { print $0 }' filename

8. FILENAME

  • 描述:代表当前输入文件的名称
  • 示例:打印当前处理的文件名
awk '{ print FILENAME }' filename

9. FNR

  • 描述:代表当前处理的文件中的行号,从1开始计数
  • 示例:打印当前处理的行号和内容
awk '{ print FNR, $0 }' filename

10. ARGV

  • 描述:一个包含命令行参数的数组
  • 示例:遍历打印命令行参数
awk 'BEGIN { for (i = 0; i < ARGC; i++) print ARGV[i] }' file1 file2

11. ENVIRON

  • 描述:一个包含环境变量的关联数组
  • 示例:打印所有环境变量及其值
awk 'BEGIN { for (var in ENVIRON) print var, ENVIRON[var] }'

12. IGNORECASE

  • 描述:控制字符串匹配时是否忽略大小写
  • 示例:在匹配时忽略大小写
awk 'BEGIN { IGNORECASE=1 } /pattern/ { print }' filename

13. RSTART 和 RLENGTH

  • 描述:
    • RSTART:上次 match() 函数匹配的起始位置
    • RLENGTH:上次 match() 函数匹配的长度
  • 示例:使用 match() 函数找到并打印匹配的子字符串及其位置
awk '{ if (match($0, /pattern/)) print "Found:", substr($0, RSTART, RLENGTH) }' filename

示例解释

- $0:表示当前行的全部内容
- NF:表示当前行的字段数
- NR:表示当前行的行号
- FS:用于指定字段分隔符
- RS:用于指定记录分隔符
- OFS:用于指定输出字段分隔符
- ORS:用于指定输出记录分隔符
- FILENAME:用于输入文件的名称
- FNR:用于输入当前处理的文件中的行号
- ARGV:输出命令行参数的数组
- ENVIRON:输出环境变量的关联数组
- IGNORECASE:控制字符串匹配时是否忽略大小写
- RSTART:上次 match() 函数匹配的起始位置
- RLENGTH:上次 match() 函数匹配的长度

内置函数

AWK 提供了多种内置函数,用于字符串处理、数学计算等

  • 字符串函数:
    • length(str):返回字符串长度
    • index(str, search):返回搜索字符串在原字符串中的位置
    • split(str, arr, sep):将字符串按分隔符分割成数组
  • 数学函数:
    • sin(x)、cos(x)、sqrt(x):三角函数和平方根函数
    • rand():返回一个0到1之间的随机数

循环语句(后面的’;'可不加)

AWK支持类C语言风格的循环语句:

  • for循环:
for (i = 1; i <= 10; i++) {
    print i;
}
  • while循环:
while (condition) {
    print $0;
    getline;
}

条件语句

AWK 中的条件语句与其他编程语言类似:

  • if语句:
if (condition) {
    print "Condition is true";
} else {
    print "Condition is false";
}
  • switch语句:
switch (variable) {
    case value1: {
        print "Value 1";
        break;
    }
    case value2: {
        print "Value 2";
        break;
    }
    default: {
        print "Default case";
        break;
    }
}

高级特性

AWK还支持更高级的特性,如函数定义、数组操作和模式动作的组合使用:

  • 函数定义:
function add(x, y) {
    return x + y;
}
  • 数组操作:
# 创建数组
arr["key1"] = "value1";
arr["key2"] = "value2";

# 遍历数组
for (key in arr) {
    print key, arr[key];
}

示例

演示了AWK的基本语法、内置变量、函数、循环和条件语句的使用:

# AWK script to print lines containing "error"
# and count lines where first field is numeric

# Print lines containing "error"
/error/ {
    print;
}

# Count lines where first field is numeric
$1 ~ /^[0-9]+$/ {
    count++;
}

# END block to print count
END {
    print "Numeric lines count:", count;
}

特殊模式

BEGIN

  • 描述:BEGIN 块用于在处理任何输入数据之前执行初始化任务,例如设置变量、打印标题、配置输出格式等BEGIN 块中的代码在任何输入数据处理之前运行一次

  • 示例:打印表头,并设置字段分隔符

awk 'BEGIN { OFS = "\t"; print "Name", "Age", "City" } { print $1, $2, $3 }' filename

示例中在处理 filename 文件之前,会打印表头 “Name”, “Age”, “City”,并将输出字段分隔符 (OFS) 设置为制表符

END

  • 描述:END 块用于在处理所有输入数据之后执行任务,例如打印总结信息、计算总和或平均值等。END 块中的代码在所有输入数据处理完后运行一次

  • 示例:计算并打印行数

awk 'END { print "Total lines:", NR }' filename

示例中在处理完 filename 文件的所有行之后,打印总行数,其中 NR 是记录数的内置变量,表示总行数

组合示例

可同时使用 BEGIN 和 END 块来初始化和总结数据处理:

awk 'BEGIN { print "Processing file:", FILENAME } 
     { sum += $2 } 
     END { print "Total sum of second column:", sum }' filename
  • BEGIN { print “Processing file:”, FILENAME }:在处理任何数据之前打印当前处理的文件名
  • { sum += $2 }:处理每一行,将第二列的值累加到 sum 变量中
  • END { print “Total sum of second column:”, sum }:在处理完所有数据后,打印第二列值的总和

BEGINFILE 和 ENDFILE

  • 描述:

    • BEGINFILE:在处理每个输入文件之前执行一次
    • ENDFILE:在处理每个输入文件之后执行一次
  • 示例:

awk 'BEGINFILE { print "Start processing", FILENAME }
     { print $0 }
     ENDFILE { print "End processing", FILENAME }' file1 file2

示例会在处理每个输入文件 file1 和 file2 前后分别打印处理开始和处理结束的消息

getline 模式

  • 描述:

    • getline 模式用于手动从输入中读取下一行并处理。可与条件和循环结构一起使用,以控制输入数据的处理方式
  • 示例:

awk '/pattern/ { 
       print "Found:", $0 
       if (getline next_line > 0) { 
           print "Next line:", next_line 
       } 
     }' filename

示例会在匹配到某个模式后,打印当前行和下一行的内容(如果存在)

总结

  • BEGIN:特殊模式块,用于在处理输入数据之前执行初始化操作
  • END:特殊模式块,用于在处理完所有输入数据后执行总结或清理操作
  • BEGINFILE 和 ENDFILE:用于在处理每个输入文件前后执行特定操作
  • getline模式:允许在脚本执行过程中手动控制输入行的读取和处理方式

常用命令行选项

  1. -F separator
  • 描述:指定字段分隔符。默认情况下,字段分隔符为任何空白字符序列
  • 示例:
awk -F ',' '{ print $1 }' filename
-F ',' 指定逗号为字段分隔符,然后打印每行的第一个字段
  1. -v var=value
  • 描述:设置 AWK 变量的值。可以在 AWK 脚本中使用 -v 选项来传递变量
  • 示例:
awk -v threshold=50 '$1 > threshold { print $0 }' filename
示例中,定义了一个变量 threshold 并将其传递给 AWK 脚本,然后根据条件打印符合要求的行
  1. -f script-file
  • 描述:从指定的文件中读取 AWK 脚本
  • 示例:
awk -f myscript.awk data.txt
示例中,AWK 将执行 myscript.awk 文件中的脚本来处理 data.txt 文件

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

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

相关文章

基于JavaScript、puppeteer的爬虫

前期准备: npm puppeteer import puppeteer from puppeteer; puppeteer文档 第一步&#xff1a;启动浏览器&#xff0c;跳转到需要爬取的页面 const browser await puppeteer.launch({ headless: false });const page await browser.newPage();await page.goto(url, { w…

ssm高校宿舍用电管理系统-计算机毕业设计源码97859

摘要 随着高校规模的扩大和学生数量的增加&#xff0c;高校宿舍的用电需求也日益庞大。为了提高用电效率、节约能源、确保用电安全和方便管理&#xff0c;开发一个高校宿舍用电管理系统具有重要意义。本系统将采用Java作为后端开发语言&#xff0c;具备跨平台特性&#xff0c;能…

收银系统源码-营销活动-幸运抽奖

1. 功能描述 营运抽奖&#xff1a;智慧新零售收银系统&#xff0c;线上商城营销插件&#xff0c;商户/门店在小程序商城上设置抽奖活动&#xff0c;中奖人员可内定&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日等特定时间促销&#xff1b;会员拉新&#xff0c;需会…

k8s-第四节-Service

Service Service 通过 label 关联对应的 PodServcie 生命周期不跟 Pod 绑定&#xff0c;不会因为 Pod 重创改变 IP提供了负载均衡功能&#xff0c;自动转发流量到不同 Pod可对集群外部提供访问端口集群内部可通过服务名字访问 创建 Service kubectl apply -f service.yamlkub…

多个comfyui之间如何共享模型,节省存储空间

COMFYUI 模型共享插件教程 一、COMFYUI 模型共享插件教程1.1 插件特性1.2 插件介绍1.3 链接 二、详细配置步骤2.1 开启开发者选项2.2 放置插件文件2.3 放置配置文件2.4 编辑配置文件2.4.1 其他配置项 三、启动COMFYUI并验证3.1 启动COMFYUI3.2 验证模型共享3.3 多整合包共享配置…

C++11|完美转化 新的类功能 可变参数模板

目录 一、完美转发 1.1模板中的&&万能引用 1.2完美转发 1.3完美转发实际中的引用场景 二、新的类功能 2.1移动构造和移动赋值规则详解 2.2类成员变量初始化和强制生成默认函数(default) 2.3禁止生成默认函数的关键字(delete) 三、可变参数模板 3.1递归函数方式…

TCP和IP数据包结构

一、问题引入 一般我们在谈上网速度的时候&#xff0c;专业上用带宽来描述&#xff0c;其实无论说网速或者带宽都是不准确的&#xff0c;呵呵。比如&#xff1a;1兆&#xff0c;512K……有些在学校的学生&#xff0c;也许会有疑问&#xff0c;明明我的业务是1M&#xff0c;为…

某yi逆向sign值

1. 定位 url: aHR0cHM6Ly93d3cuaXFpeWkuY29tL3ZfMTlycjRyZ3AxZy5odG1s打开网址&#xff0c;找到sign值所在位置 应该是32位大写md5加密&#xff0c;可以看到console中加载出来很多东西&#xff0c;往下翻到base_info所在位置 点进去main.js&#xff0c;打上断点 2. 调试 刷…

项目基础知识

1.JDBC编程和MySQL数据库 数据库的连接&#xff08;以前写qq项目时的代码&#xff09; package com.wu.Util; import java.sql.*; public class JDBCUtil {private static JDBCUtil jdbcUtil null;private JDBCUtil() {}public static JDBCUtil getJdbcUtil() {if (jdbcUtil…

基于Echarts进行图表组件的封装

什么是Echarts 是一个使用js实现的开源可视库&#xff0c;提供了多种图表&#xff0c;但是当我们在项目中进行使用的时候可能就是需要进行一系列的相关配置如&#xff1a; 标题&#xff0c;类型&#xff0c;x轴&#xff0c;y轴等&#xff0c;当我们使用较为频繁的时候就容易导…

昇思25天学习打卡营第16天 | DCGAN生成漫画头像

这两天把minspore配置到我的电脑上了&#xff0c;然后运行就没什么问题了✨&#x1f60a; 今天学这个DCGAN生成漫画头像&#xff0c;我超级感兴趣的嘞&#x1f984;&#x1f970; GAN基础原理 这部分原理介绍参考GAN图像生成。 DCGAN原理 DCGAN&#xff08;深度卷积对抗生成…

一本超简单能用Python实现办公自动化的神书!让我轻松摆脱办公烦恼!

《超简单&#xff1a;用Python让Excel飞起来》 这本书旨在通过Python与Excel的“强强联手”&#xff0c;为办公人员提供一套高效的数据处理方案。书中还介绍了如何在Excel中调用Python代码&#xff0c;进一步拓宽了办公自动化的应用范围。 全书共9章。第1~3章主要讲解Python编…

【数据结构】06.栈队列

一、栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out)的原则。 压栈&#…

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

洗地机品牌哪个最好用?硬核推荐五大实力爆款洗地机

在这个忙碌的时代&#xff0c;家就是我们放松的港湾&#xff0c;但要保持它的清洁与舒适常常很不容易。每天拖着疲惫的身体回家&#xff0c;还要面对地板上那些难缠的灰尘、污渍&#xff0c;真是非常让人头疼。不过&#xff0c;洗地机的出现就像是给家务清洁装上了智能引擎&…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

一篇文章带你完全理解C语言数组

文章目录 1.一维数组的创建和初始化数组的创建1.2数组的初始化1.3 一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1 冒泡排序函数的错…

从零开始开发美颜SDK:打造属于平台的主播美颜工具

本篇文章&#xff0c;小编将从零开始&#xff0c;介绍如何打造一款属于平台的主播美颜工具。 一、需求分析 首先&#xff0c;明确开发美颜SDK的需求是至关重要的。当前市场上&#xff0c;美颜工具的功能主要包括&#xff1a; 1.实时美颜&#xff1a;磨皮、美白、瘦脸等基础功…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可以用于多种上…

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索&#xff0c;这些项目具体信息会发布到知识星球&#xff0c;请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…