awk 习题

本文通过一系列实战案例介绍AWK命令的基本用法及高级技巧,包括数据处理、文本操作、统计计算等,适合初学者及进阶用户学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk 习题

[@more@]

1.使用:符号做分隔符,将字段逆序输出/etc/passwd文件的每行
[root@ pub]# awk -F: '{for(i=NF;i>1;i--) printf "%s:",$i;print $i}' /etc/passwd

2.
# awk -F: 'NR < 11 {print $3,$1}' /etc/passwd > name.txt
# awk -F: 'NR < 11 {print $3,$6}' /etc/passwd > home.txt
# join name.txt home.txt
观察两个文件,以及join命令输出,用awk引入name.txt,home.txt两个文件,模拟joni命令的输出
[root@ awk]# awk '{ary[$1]=NR==FNR?$2:ary[$1]" "$2}END{for(i in ary) print i,ary[i]}' name.txt home.txt

3.统计/etc/passwd中每种shell的被使用人数
输出格式:
counts shell
1
1 /bin/sync
4 /bin/bash
31 /sbin/nologin
1 /sbin/halt
1 /sbin/shutdown
[root@ awk]# awk -F: '{ary[$NF]++}END{for(i in ary) print ary[i],i}' /etc/passwd
1
1 /bin/sync
18 /bin/bash
30 /sbin/nologin
1 /sbin/halt
1 /sbin/shutdown
[root@ awk]#

4.统计ps中VSZ,RSS各自总和
输出格式:
ps MEM statistic
VSZ_SUM : 164.277M
RSS_SUM : 47.8555M

[root@ awk]# ps aux | awk 'BEGIN{print "ps MEM statistic"}{V+=$5;R+=$6} END{print "VSZ_SUM: "V/1024"MnRSS_SUM: "R/1024"M"}'
ps MEM statistic
VSZ_SUM: 1870.04M
RSS_SUM: 370.203M
[root@ awk]#
5.计算/etc/passwd中所有用户的UID平均数,以及GID平均数.
输出格式:
UID and GID AVG
UID-AVG : 1750.72
GID_AVG : 1754
[root@ awk]# awk -F: '{U+=$3;G+=$4}END{print "U_avg: "U/NR"nG_avg: "G/NR}' /etc/passwd
U_avg: 1449.83
G_avg: 1452.65
[root@ awk]# awk -F: '{U+=$3;G+=$4;c++}END{print "U_avg: "U/c"nG_avg: "G/c}' /etc/passwd
U_avg: 1449.83
G_avg: 1452.65
[root@ awk]#
[root@ awk]# awk -F: '$0 !~ /^$/{U+=$3;G+=$4;c++}END{print "U_avg: "U/c"nG_avg: "G/c}' /etc/passwd
U_avg: 1449.83
G_avg: 1452.65
[root@ awk]#
6.
根据uid值给用户分等级 Admin system users
输出格式:

LEVEL NAME

Admin root
sysuser bin
users seker

admin_count: N sys_user_count: N users_count: N

[root@ awk]# awk -F: 'BEGIN{print "LEVELtNAME"}{if($3==0) { a++;print "admint"$1}else if ($3<500) { s++;print "sysusert"$1}else {u++;print "usert"$1}}END{print "admin: "a,"sysuser: "s,"users: "u}' /etc/passwd

7.用awk实现 tail -n 5 file 命令
[root@ awk]# awk '{if(NR%5==0){i=0};ary[++i]=$0}END{for(i=1;i<=5;i++) print ary[i]}' ./tmp.txt
8.
SHELL实现批量建立多个文件,将文件拓展名加上.txt,再加上.doc,再把中间的.txt去掉
[root@ dir]# for i in *;do mv $i $(sed 's/.txt//' <<< $i);done
[root@ dir]# ls
a_1.doc a_3.doc b_2.doc c_1.doc c_3.doc
a_2.doc b_1.doc b_3.doc c_2.doc
[root@ dir]#
9.
AWK脚本实现间隔五行打印表头
[root@mail ~]# ./awk_print.sh /etc/passwd
Username Uid
root 0
bin 1
daemon 2
adm 3
lp 4

Username Uid
shutdown 6
halt 7
mail 8
news 9
uucp 10

[root@ dir]# awk -F: 'BEGIN{print "Username Uid"}{if(NR%5==0)print ""$1"t"$3"nnUsername Uid";else print $1"t"$3}' /etc/passwd

awk_print.sh
debian:/home/sungy/myshell/sh# cat awk_print.sh
#! /usr/bin/awk -f

BEGIN{
printf "UsernametUidn"
}

{
printf "%-15s %-5sn",$1,$3
if(NR%5==0)
{
print "n"
}
}
debian:/home/sungy/myshell/sh#

10.用$RANDOM产生100个随机数,交给AWK产生数组,在数组内部排序,最后输出.(禁止用sort命令)

awk_rand.sh
#! /usr/bin/awk -f

BEGIN{
srand($RANDOM)
for(i=0;i<100;i++)
{
ary[i]=int(rand()*10000)
}

for(i=0;i<100;i++)
{
for(j=i+1;j<100;j++)
{
if(ary[i]>ary[j])
{
temp=ary[i]
ary[i]=ary[j]
ary[j]=temp
}
}
}

for(i=0;i<100;i++)
{
printf "%st",ary[i]
}

print "n"
}


11.
建立 aa.txt 文本
# cat aa.txt
aaa/bbb/ccc
ddd/eee/fff
ggg/hhh/iii
aaa/bbb/ccc/aaa/bbb/ccc/ddd/eee
# 用AWK或SED输出如下格式
ccc aaa/bbb/
fff ddd/eee/
iii ggg/hhh/
eee aaa/bbb/ccc/aaa/bbb/ccc/ddd/
[root@ dir]# sed -rn 's!(.*/)(.*)!2 1!p' aa.txt
ccc aaa/bbb/
fff ddd/eee/
iii ggg/hhh/
eee aaa/bbb/ccc/aaa/bbb/ccc/ddd/
[root@ dir]#

[root@ dir]# awk -F/ '{print $NF,gensub($NF"$","","g",$0)}' aa.txt
ccc aaa/bbb/
fff ddd/eee/
iii ggg/hhh/
eee aaa/bbb/eee/aaa/bbb/ccc/ddd/
[root@ dir]#


awk -F/ '{printf "%st",$NF ;for(i=1;i

12
建立 a.txt b.txt 文件
[root@tch254 ~]# cat a.txt
1 a
2 b
3 c
4 d
5 e
6 f
7 g

a.txt: ary[$1]=$2
ary[1]="a" ary[2]="b" ary[3]="c" ary[4]="d" ary[5]="e" ...
b.txt: ary[5] $2
ary[4] $2
ary[3] $2


[root@tch254 ~]# cat b.txt
5 ABC
3 DEF
4 XYZ
[root@tch254 ~]# 使用AWK处理两个文件输出如下结果
e ABC
c DEF
d XYZ
[root@tch254 ~]#

awk '{if(NR==FNR){ary[$1]=$2}else{print ary[$1]"t"$2}}' a.txt b.txt

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23168012/viewspace-1050396/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23168012/viewspace-1050396/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值