Linux - awk 命令 快速学习

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个字符.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值