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比较文章来源:https://www.toymoban.com/news/detail-599544.html
[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个字符.文章来源地址https://www.toymoban.com/news/detail-599544.html
到了这里,关于Linux - awk 命令 快速学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!