Linux - awk 命令 快速学习

Linux - awk 命令 快速学习awk 会对数据流 可以是系统的文件 网络的文件 管道流 的每一行 以某个分隔符分割 进行处理并输出内容 root iZwz9euj2j1u sea awk F print 1 3 etc passwd head 5 root 0 bin 1 daemon 2 adm 3 lp 4 F

大家好,我是讯享网,很高兴认识大家。

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 apple450 pear600 peach899 juice200 strawberry800 grage300 kiwi100 banana400 watermelon659 plun300 cherry329 orange789 mango430 lemon854 pineapple439 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个字符.

小讯
上一篇 2025-01-25 11:42
下一篇 2025-03-12 12:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/63481.html