返回顶部
首页 > 资讯 > 服务器 >shell脚本 之 awk详解(数据筛选)
  • 271
分享到

shell脚本 之 awk详解(数据筛选)

linux运维服务器 2023-09-29 19:09:20 271人浏览 泡泡鱼
摘要

1. awk命令简介 awk是专门为文本处理设计的编.程语言,也是一个应用程序,几乎所有linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。 awk是一种强大的编辑工具,比

1. awk命令简介

awk是专门为文本处理设计的编.程语言,也是一个应用程序,几乎所有linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。

  • awk是一种强大的编辑工具,比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
  • awk 比较倾向于将一行分成多个字段然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

awk工作原理

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
  • 在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“”、“||”表示“”、“!”表示“”;还可以进行简单的数学运算,如+、-、*、/、%^分别表示加、减、乘、除、取余乘方

2. awk命令格式

它与grepsed命令一样都是以行为单位读取文本的,默认以空格或Tab键为分隔符,将分割所得的各个字段保存到内建变量中供后续使用

命令格式如下:

awk "[选项1] {操作1;操作2} [选项2] {操作3;操作4} ..." 文件名awk -f 脚本文件 文件名

awk语法由一系列选项和操作组成,在花括号内可以有多个操作,在多个操作之间是有分号分隔,在多个选项和操作之间可以有若干空格,也可以没有

选项说明:
-F fs or --field-separator fs:相当于内建变量“FS”,指定分割符为fs,默认为空格或Tab制表符;
-f scripfile or --file scriptfile:从文件中读取awk指令,用来代替命令行中输入的命令;
-v var=value or --asign var=value:设置一个变量并且附上初值。

3. awk常见的内置变量和运算符

常见的内置变量如下

内置变量说明
$0当前记录(作为单个变量),即当前处理的行的字段个数
FS列分割符指定每行文本的字段分隔符,默认为空格或制表位。也可用选项"-F"表示
NF当前处理行的字段个数,即列数,从1开始
NR当前记录中的行数,从1开始
$n当前处理行的第n个字段(第n列)
RS行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
FILENAME被处理的文件名
FNR当awk处理多个文件时,分别对每个文件的行数进行计数
ORS更改行换行符
OFS更改列分割符
ARGV表示是一个数组,这个数组中保存的是命令行所给定的参数
ARGC表示参数的数量,也可以理解为ARGV数组的长度

运算符

运算符描述
= += -= *= /= %= ^= **=赋值
?:C语言中的三目运算符
< <= > >= != ==关系运算
+ - * / %算术运算
^ **求幂
++ --自增和自减
||和&&逻辑或/与
$字段引用
in数组成员

4. awk常见用法汇总

4.1 基础用法

示例,编写一个test.txt文本

root@ubuntu:/home/zgx/Desktop# cat test.txt    # 查看文本内容this is a test filehello,world!bye byehayear, month, day, hour, minute, secondroot@ubuntu:/home/zgx/Desktop# awk "{print NF}" test.txt     # 使用NF显示每行的列数5126root@ubuntu:/home/zgx/Desktop# awk "{print $NR}" test.txt     # 打印显示当前每行记录this is a test filehello,world!bye byehayear, month, day, hour, minute, second

4.1.1 打印指定列的内容

使用$1,$4打印第1列、第4列的内容

root@ubuntu:/home/zgx/Desktop# awk '{print $1,$4}' test.txt   # 普通输出this testhello,world!bye year, hour,root@ubuntu:/home/zgx/Desktop# awk '{printf "%-10s %-10s\n",$1,$4}' test.txt   # 格式化输出this       test                 !bye                  year,      hour,  

注意:print与printf的区别:
1)printf用于格式化输出
2)printf默认是不带换行符号的,所以要换行需要带上\n

4.1.2 打印指定分隔符的内容

指定英文逗号“,”为分隔符

root@ubuntu:/home/zgx/Desktop# awk -F',' '{print $1,$4}' test.txtthis is a test filehello bye byehayear  hour

4.1.3 打印多个分隔符的内容

指定多个分割符输出(首先使用空格,然后在使用其他分割符)

root@ubuntu:/home/zgx/Desktop# awk -F '[, ]' '{print NF}' test.txt   # 查看分隔后的每行列数52211root@ubuntu:/home/zgx/Desktop# awk -F '[, ]' '{print $1,$2,$3}' test.txtthis is ahello world!bye byehayear [空格] month

4.2 进阶用法

4.2.1 打印指定行的内容

打印第i到第j行的内容(两种方法)

root@ubuntu:/home/zgx/Desktop# awk 'NR==2,NR==4{print}' test.txt   # 打印第2到第4的内容root@ubuntu:/home/zgx/Desktop# awk 'NR==2,NR==4' test.txt     # {print}可要可不要hello,world!bye byehayear, month, day, hour, minute, secondroot@ubuntu:/home/zgx/Desktop# awk '(NR>=2)&&(NR<=4){print}' test.txt   # 打印第2到第4的内容root@ubuntu:/home/zgx/Desktop# awk '(NR>=2)&&(NR<=4)' test.txt   # {print}可要可不要hello,world!bye byehayear, month, day, hour, minute, second

打印第i、第j行的内容

root@ubuntu:/home/zgx/Desktop# awk 'NR==2 || NR==4' test.txt    # 打印第2、第4行的内容hello,world!year, month, day, hour, minute, second

4.2.2 支持正则表达式

显示text2.txt文本内容如下

root@ubuntu:/home/zgx/Desktop# cat test2.txtthis is a test filehello,world!bye byehayear, month, day, hour, minute, secondhahahahello everybodyaaaaaaaaa

输出以h、he开头的行

root@ubuntu:/home/zgx/Desktop# awk '/^h/{print}' test2.txt   # 打印以h开头的行hello,world!hahahahello everybodyroot@ubuntu:/home/zgx/Desktop# awk '/^he/' test2.txt   # 打印以he开头的行hello,world!hello everybody

输出以d!为结尾的行

root@ubuntu:/home/zgx/Desktop# awk '/d!$/' test2.txthello,world!

输出第2列包含字符b的行

root@ubuntu:/home/zgx/Desktop# awk '$2 ~ /b/' test2.txtbye byehahello everybodyroot@ubuntu:/home/zgx/Desktop# awk '$2 !~ /b/' test2.txt    # 输出第2列不包含字符b的行this is a test filehello,world!year, month, day, hour, minute, secondhahahaaaaaaaaaa

4.2.3 根据运算符过滤指定的行

显示test3.txt文本的内容如下:

root@ubuntu:/home/zgx/Desktop# cat test3.txt101 this is a test file102 hello world!203 bye byeha204 year, month, day, hour, minute, second205 fawffno number206,aaaaaaaa

输出第i列数值在指定范围的行

root@ubuntu:/home/zgx/Desktop# awk '$1>200' test3.txt    # 输出第1列数值大于200的行203 bye byeha204 year, month, day, hour, minute, second205 fawffno number206,aaaaaaaaroot@ubuntu:/home/zgx/Desktop# awk '$1>300' test3.txt     # 输出第1列数值大于300的行no number

输出第1列小于100且第2列字符串为“hello”的行

root@ubuntu:/home/zgx/Desktop# awk '$1<200 && $2=="hello"' test3.txt102 hello world!

4.2.4 输出与指定内容相反的行

输出以非h开头的行

root@ubuntu:/home/zgx/Desktop# awk '!/^h/' test2.txt   # 打印以非h开头的行this is a test filebye byehayear, month, day, hour, minute, secondaaaaaaaaa

输出第1列数值非大于200的行

root@ubuntu:/home/zgx/Desktop# awk '!($1>200)' test3.txt101 this is a test file102 hello world!

4.2.5 设置变量

root@ubuntu:/home/zgx/Desktop# awk -F'[, ]' -va=1 -vb=sss '{print $1,$1+a,$1a,$1b}' test3.txt101 102 1011 101sss102 103 1021 102sss203 204 2031 203sss204 205 2041 204sss205 206 2051 205sssno 1 no1 nosss206 207 2061 206sss

4.3 字符串函数

函数说明
length()返回字符串的长度
index()返回下标
tolower()转换成小写并返回字符串
toupper()转换成大写并返回字符串
substr()返回字符串中的子串
match()返回下标,但它不搜索子串
sub()替换匹配的第一个字符串序列,并返回整个字符串
gsub()替换匹配的所有字符串序列,并返回整个字符串
split()分割字符串并将各部分放到使用整数下标的数组中

打印各行字符串的长度

root@ubuntu:/home/zgx/Desktop# cat test2.txtthis is a test filehello,world!bye byehayear, month, day, hour, minute, secondhahahahello everybodyaaaaaaaaaroot@ubuntu:/home/zgx/Desktop# awk '{print length()}' test2.txt19129386159

打印字符串长度超过15的行

root@ubuntu:/home/zgx/Desktop# awk 'length>15' test2.txtthis is a test fileyear, month, day, hour, minute, second

字符串大小写转换

root@ubuntu:/home/zgx/Desktop# awk '{print $1, tolower($2), toupper($3)}' test2.txtthis is Ahello,world!  bye byeha year, month, DAY,hahaha  hello everybody aaaaaaaaa 

打印每行的最后两个字符

root@ubuntu:/home/zgx/Desktop# awk '{print substr($0,length($0)-1)}' test2.txtled!handhadyaa

4.4 BEGIN/END关键字

默认情况下awk是从输入中读取一行字符串,然后对该行执行相应的命令,而有时候想在执行这些命令之前先进行一些其他的脚本命令,则可以使用BEGIN关键字,而END关键字的处理时机则刚好相反。
代码示例:

root@ubuntu:/home/zgx/Desktop# awk 'BEGIN{print "---file start---"} {print $1,$4} END{print "---file end---"}' test2.txt---file start---this testhello,world! bye year, hour,hahaha hello aaaaaaaaa ---file end---

来源地址:https://blog.csdn.net/m0_46201294/article/details/128314651

--结束END--

本文标题: shell脚本 之 awk详解(数据筛选)

本文链接: https://lsjlt.com/news/421587.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • shell脚本 之 awk详解(数据筛选)
    1. awk命令简介 awk是专门为文本处理设计的编.程语言,也是一个应用程序,几乎所有Linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。 awk是一种强大的编辑工具,比...
    99+
    2023-09-29
    linux 运维 服务器
  • shell脚本之sed详细用法详解
    目录sed的作用sed使用方法介绍命令行格式举例说明对文件进行增、删、改、查操作增加文件内容对文件进行搜索替换操作其他命令其他选项sed结合正则使用补充扩展总结总结sed的作用 sed是Stream Editor(流编辑...
    99+
    2022-07-05
    shell脚本 sed shell sed命令详解 sed命令详解
  • Shell 脚本详解
    简介 shell :蛋、壳。shell脚本是在操作系统外,可以直接调用系统内核命令的一个脚本语言。 shell脚本可以分为两大类组成: 1.命令行 (系统命令行)2.脚本语法 (编程语言的基本语法) 命令行:可以直接和系统内核进行交换使用 ...
    99+
    2023-08-19
    linux bash 服务器
  • Python 列表筛选数据详解
    目录总结 在做数据处理中,常会遇到列表筛选,比如有以下两个列表: 根据上列表中的KEY1 , 筛选下列表的数据,也就是标黄的数据。数量不大的情况,一般就是遍历比较,逻辑简单,几行...
    99+
    2024-04-02
  • linux awk时间计算脚本及awk命令详解
    在linux如果计划时间是个麻烦事, 用awk脚本如下 BEGIN {FS=":";OFS=":"} {total_seconds=total_seconds+$3} total_seconds&g...
    99+
    2022-06-04
    详解 脚本 命令
  • linux shell脚本详解
    shell 1. 基础 # shell的执行方式:- 路径方式 :必须赋予权限- source 立即执行,不需要权限- bash 执行新建一个文件,扩展名为sh(sh代表shell),输入一些代码:...
    99+
    2023-09-08
    linux bash 运维
  • 详解Linux--shell脚本之正则表达式
    一、正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。规定一...
    99+
    2022-06-04
    详解 脚本 正则表达式
  • Python学习之shell脚本的使用详解
    目录一、sh是什么二、使用步骤1.安装2.使用示例3.使用sh执行命令4.关键字参数5.查找命令6.Baking参数一、sh是什么 SH是一个独特的子进程包装器,可将您的系统程序动态...
    99+
    2023-05-17
    Python使用shell脚本 Python shell脚本 Python shell
  • shell脚本编程之数组
    数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的元素。数组是在程序设计...
    99+
    2022-06-04
    数组 脚本 shell
  • MySQL之where条件数据筛选
    语法: -- select * from 表名 where 条件; 测试数据: -- 建表语句 create table `student` ( `sid` int(11) primary key auto_incr...
    99+
    2022-01-01
    MySQL之where条件数据筛选
  • Go素数筛选分析详解
    目录Go素数筛选分析1. 素数筛选介绍2. 代码分析3. 代码验证4. 总结Go素数筛选分析 1. 素数筛选介绍 学习Go语言的过程中,遇到素数筛选的问题。这是一个经典的并发编程问题...
    99+
    2024-04-02
  • R语言:数据筛选match的使用详解
    数据筛选是在分析中最常用的步骤,如微生物组分析中,你的OTU表、实验设计、物种注释之间都要不断筛选,来进行数据对齐,或局部分析。 今天来详解一下此函数的用法。 match match...
    99+
    2024-04-02
  • shell脚本--sed的用法详解
    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。 sed是linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵...
    99+
    2022-06-04
    shell --sed
  • Shell脚本的超详细讲解
    Shell脚本是一种文本文件,包含了一系列的命令和控制结构,用于在Unix或类Unix操作系统上执行一系列的任务。下面是Shell脚...
    99+
    2023-08-16
    Shell
  • R语言行筛选的方法之filter函数详解
    目录1. 数据2. 生成ID列和类型3. 提取effect大于0.1的行4. 提取加性效应,且effect小于0的行5. 根据部分行名删选6. 固定字符特征进行行筛选总结下面介绍一下...
    99+
    2024-04-02
  • Python数据分析之 Pandas Dataframe条件筛选遍历详情
    目录一、条件筛选二、Dataframe数据遍历for...in...语句iteritems()方法iterrows()方法itertuples()方法一、条件筛选 查询Pandas ...
    99+
    2024-04-02
  • Shell AWK编程的基本介绍和使用详解
    目录1、AWK介绍(1)AWK概述(2)printf格式化输出(3)printf命令说明2、AWK的基本使用(1)AWK命令说明(2)AWK命令使用1、AWK介绍 (1)AWK概述 AWK是一种处理文本文件的语言,是一个...
    99+
    2022-06-08
    Shell AWK使用 Shell AWK基本介绍
  • shell 脚本操作informix数据库
    shell 脚本操作informix数据库的简单模板: functionName(){ dbaccess ...
    99+
    2018-06-19
    shell 脚本操作informix数据库
  • Shell 脚本备份MySQL数据库
    (1)思路  <1>安装MySQL数据库  <2>创建数据库,表,插入数据   <3>授权一个用于备份数据库的用户名和密码&nbs...
    99+
    2024-04-02
  • MySQL数据库备份Shell脚本
    此脚本将远程主机或者本地主机上的数据库的数据备份到本地。备份MySQL数据库除了information_schema、performance_schema、mysql自带库的其他生产库。备份时将MySQL数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作