Linux - awk 命令 快速学习

news/2024/7/5 7:12:29

awk会对数据流(可以是系统的文件, 网络的文件, 管道流)的每一行, 以某个分隔符分割,进行处理并输出内容. 

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk -F: '{print $1,$3}' /etc/passwd | head -5
root 0
bin 1
daemon 2
adm 3
lp 4

-F:  以:分割字符串,等于 -F ":"

'{}'  运行代码

print  输出

$1,$3  分隔之后的第一和第三个字符,中间是逗号, 输出分隔默认是空格

管道命令, 作为后面命令的输入流

head -5 显示前面5条数据

创建测试文件

vi fruit
apple 450
pear 600
peach 899
juice 200
strawberry 800
grage 300
kiwi 100
banana 400
watermelon 659
plun 300
cherry 329
orange 789
mango 430
lemon 854
pineapple 439
[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '{print $1,$2}' fruit
apple 450
pear 600
peach 899
juice 200
strawberry 800
grage 300
kiwi 100
banana 400
watermelon 659
plun 300
cherry 329
orange 789
mango 430
lemon 854
pineapple 439

去掉-F:, 默认是" "作为分隔符

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk 'BEGIN{print "####start####"}{print $1,$2}END{print "####end####"}' fruit
####start####
apple 450
pear 600
peach 899
juice 200
strawberry 800
grage 300
kiwi 100
banana 400
watermelon 659
plun 300
cherry 329
orange 789
mango 430
lemon 854
pineapple 439
####end####

BEGIN 对每行输出之前执行的代码, 必须大写, 用{}包含, 输出的文字必须用双引号

END 对每行输出之后执行的代码, 必须大写, 用{}包含, 输出的文字必须用双引号

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk 'BEGIN{print "####start####"} OFS="##"{print $1,$2} END{print "####end####"}' fruit
####start####
apple##450
pear##600
peach##899
juice##200
strawberry##800
grage##300
kiwi##100
banana##400
watermelon##659
plun##300
cherry##329
orange##789
mango##430
lemon##854
pineapple##439
####end####

OFS="##" 输出的时候以##为分隔符, 必须有双引号

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '$2 > 300 {print $1,$2}' fruit
apple 450
pear 600
peach 899
strawberry 800
banana 400
watermelon 659
cherry 329
orange 789
mango 430
lemon 854
pineapple 439

$2 > 300 可以对数据进行逻辑判断, 第二个数据大于300.

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '{if($2<200) print $1"价格便宜";else if($2<600) print $1"价格还可以";else print $1"价格很贵"}' fruit
apple价格还可以
pear价格很贵
peach价格很贵
juice价格还可以
strawberry价格很贵
grage价格还可以
kiwi价格便宜
banana价格还可以
watermelon价格很贵
plun价格还可以
cherry价格还可以
orange价格很贵
mango价格还可以
lemon价格很贵
pineapple价格还可以

if(判断语句) 执行语句;else if(判断语句) 执行语句;else 执行语句;

执行语句后面必须跟逗号, 输出字符串必须用双引号.

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '{if($2<200) {print $1"价格便宜";num1++;}else if($2<600) {print $1"价格还可以";num2++;}else{print $1"价格很贵";num3++;}}END{print "价格便宜有"num1"个, 价格还可以的有"num2"个, 价格贵的有"num3"个"}' fruit
apple价格还可以
pear价格很贵
peach价格很贵
juice价格还可以
strawberry价格很贵
grage价格还可以
kiwi价格便宜
banana价格还可以
watermelon价格很贵
plun价格还可以
cherry价格还可以
orange价格很贵
mango价格还可以
lemon价格很贵
pineapple价格还可以
价格便宜有1个, 价格还可以的有8个, 价格贵的有6个

if(判断语句) {执行语句;}else if(判断语句) {执行语句;}else {}执行语句;}

一条执行语句是省略了大括号

#最受欢迎的城市投票
vi vote
湖南 3
北京 2
广东 3
上海 5
深圳 2
安徽 2
云南 8
贵州 3
广东 4
北京 4
上海 2
安徽 7
[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '{vote[$1]+=$2}END{for (i in vote) print i,vote[i]}' vote | sort -k 2 -nr
安徽 9
云南 8
广东 7
上海 7
北京 6
贵州 3
湖南 3
深圳 2

vote[$1]+=$2 定义一个vote数组, 数组的下标是城市, 值是城市投票

for (变量 in 数组) 循环数组中的数据

sort -k 2 -nr  == sort -t ' ' -k 2 -nr

-t ' ' 默认根据空格分隔, 可以省略

-k 2 取第二个数据

-n 转换成integer

-r 升序, 默认是降序

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk -F: '$7 ~ /bash/ {print $1,$3,$7}' /etc/passwd
root 0 /bin/bash
admin 1000 /bin/bash
u1 400 /bin/bash

$7 ~ /bash/ ~ 匹配就/bash/就返回true, bash后面必须加/

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk -F: '$7 ~ /bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000::/home/admin:/bin/bash
u1:x:400:1002::/home/u1:/bin/bash

$0 原来整行的数据

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '$2 > 300 {printf "%s %s\n", $0,"TRUE"}  $2<=300 {print $0}' fruit
apple 450 TRUE
pear 600 TRUE
peach 899 TRUE
juice 200
strawberry 800 TRUE
grage 300
kiwi 100
banana 400 TRUE
watermelon 659 TRUE
plun 300
cherry 329 TRUE
orange 789 TRUE
mango 430 TRUE
lemon 854 TRUE
pineapple 439 TRUE

%s  字符串占位符, 第一个%s输出行数据, 接着空格, 第二个字符串输出"TRUE", 

\n 换行

"%s %s\n" 必须用双引号

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk 'NR > 5&&NR<10 {print NR,$1,$2}' fruit
6 grage 300
7 kiwi 100
8 banana 400
9 watermelon 659

NR 当前行
 

[root@iZwz9euj2j1u3uw9bv632sZ sea]# user_name=jesse
[root@iZwz9euj2j1u3uw9bv632sZ sea]# echo | awk -v name=$user_name '{print name}'
jesse

-v 把环境变量赋值name, 使用环境变量必须用$.

vi aw.sh
#!/bin/bash
awk -v var=$1 'var==$1{print NR,$0;}' fruit

[root@iZwz9euj2j1u3uw9bv632sZ sea]# ./aw.sh apple pear
1 apple 450

var=$1  $1表示执行bash程序传入的第一个参数, 赋值给var

var==$1 分隔后的第一个字符串和变量var比较

[root@iZwz9euj2j1u3uw9bv632sZ sea]# awk '$2>400 {print substr($1,1,3)}' fruit
app
pea
pea
str
wat
ora
man
lem
pin

substr($1,1,3)  第一个字符开始, 取长度3个字符.


http://lihuaxi.xjx100.cn/news/1367787.html

相关文章

serializers.PrimaryKeyRelatedField()是Django REST Framework(DRF)提供的一个序列化字段类

1.serializers.PrimaryKeyRelatedField()是Django REST Framework&#xff08;DRF&#xff09;提供的一个序列化字段类&#xff0c;用于在序列化和反序列化过程中处理其他模型之间的关联关系。 该字段类接受一个参数&#xff0c;即关联模型的主键。它将根据这个主键自动序列化和…

RocketMQ集成Springboot --Chapter5

RocketMQ tag过滤和sql92语法过滤 tag过滤 生产者&#xff0c;由于springboot没有专门对mq进行tag标记的方法&#xff0c;只是在topic:后面加上&#xff0c;所以只需 rocketMQTemplate.sendOneWay(“tagFilterBoot:TagA”,msg1);标记即可 生产者代码如下 /***生产者* tag过滤*…

Python 模块 ddt 数据驱动测试

简介 ddt 提供了一种方便的方法来实现数据驱动测试&#xff08;Data-Driven Testing&#xff09;。数据驱动测试是一种测试方法&#xff0c;通过将测试数据与测试逻辑分开&#xff0c;可以使用不同的数据集来运行相同的测试用例。这样可以提高测试的灵活性和可维护性&#xff0…

“深入探究Spring Boot:从入门到精通“

标题&#xff1a;深入探究Spring Boot&#xff1a;从入门到精通 摘要&#xff1a;Spring Boot是一个快速开发框架&#xff0c;它简化了Spring应用的搭建和配置。本文将从入门到精通&#xff0c;介绍Spring Boot的核心概念和用法&#xff0c;并通过示例代码详细解释每个概念。 …

【网络代理】(三)Docker+Haproxy 搭建四层代理

目录 1.1 创建 web 服务器镜像 1.2 启动 web 服务器容器 2.1 编写 haproxy 配置文件 2.2 拉取 haproxy 镜像 2.3 启动 haproxy 容器 3.1 访问 8000 端口 3.2 查看 web 服务器容器日志 附录&#xff1a;haproxy 仪表板 1.1 创建 web 服务器镜像 编写一个 Docke…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Centos Certbot 使用

安装 可选配置&#xff1a;启动EPEL存储库 非必要项 yum install -y epel-release yum clean all yum makecache #启用可选通道 可以不配置 yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional必要配置…

进程间的通信之管道(匿名管道)

文章目录 进程间通信&#xff08;IPC&#xff09;管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信&#xff08;IPC&#xff09; inter process conmmunication &#x1f447;&#x1f447;&#x1f…