awk 自学练习

实战 匹配行末数字并求和

awk '{if($NF ~ /^[0-9]+$/) print $NF;}' 2006-2014.txt | awk '{sum+=$1}END{print sum}'

某列最大最小值

awk 'BEGIN {max = 0;min = 65535} {min=min<$1?min:$1; max=max>$1?max:$1} END {print "Max=", max, min}' test

练习1

vim a.txt

Red Hat Enterprise Linux Version 5.3
Get the latest news about the world's Open Source Leader
Red Hat Network
Manage your system dffectively through Red Hat Network
Global Learning Services
You've got Red Hat Enterprise Linux,now get the skills
check out Red Hat's training courses and industry-acclaimed
#This is a test456 line
   space test123 line234


1.编写一个awk脚本,功能是打印所有行
2.编写一个awk脚本,打印文件第八行
3.用awk命令打印文件所有行的第一个字段
4.打印输入行总数
5.打印每行字段数
6.打印最后一行
7.打印字段数多于4个的行
8.打印文件所有字段的总数
9.打印3-8行
10.在文件顶部加上标题“Document”
11.隔行删除(1,3,5,...行删除)
12.查找system替换成***SYSTEM***
14.打印一列数字的总和。
1.编写一个awk脚本,功能是打印所有行
awk '{print $0}' a.txt 

2.编写一个awk脚本,打印输入文件第八行
awk '{if(NR==8){print $0}}' a.txt

3.用awk命令打印文件所有行的第一个字段
awk '{print $1}' a.txt 

4.打印输入行总数
[root@slavedb test]# awk 'END{print NR}' a.txt 

5.打印每行字段数
awk '{print NF}' a.txt

6.打印最后一行
awk '{tail=$0}END{print tail}' a.txt 
awk 'END{print $0}' a.txt

7.打印字段数多于4个的行
awk '{if(NR>4){print $0}}' a.txt
awk 'NR>4' a.txt

8.打印文件所有字段的总数
awk 'BEGIN{n=0}{n=n+NF}END{print n}' a.txt

9.打印3-8行
awk 'NR>=3 && NR<=8' 1.txt
awk '{ if(NR>=3 && NR<=8){print} }' a.txt

10.在文件顶部加上标题“Document”
awk 'BEGIN{print "Document"}{print}' a.txt

11.隔行删除(1,3,5,...行删除)
awk '{ if(NR%2 == 0){print $0} }' a.txt

12.查找system替换成***SYSTEM***
awk '{gsub(/system/,"****SYSTEM****",$0);  print $0}' a.txt

13.取ifconfig eth0 的IP
ifconfig eth0 | awk '/inet /{print $2,$NF}' | awk -F"[ :]" '{print $2"/"$NF}'

14.打印一列数字的总和。
seq 100 | awk '{sum+=$1}END{print sum}'

练习2


1. sed和awk有什么区别?
(1)awk:按列(域)操作;sed:按行操作
(2)awk:文本处理语言,适合对文本进行抽取处理;sed:非交互式的编辑器,适合对文本进行编辑

2. awk要处理域的时候,以哪个参数作为分割参数?
-F
 
3. 请打印出/etc/passwd 第一个域,并且在第一个域所有的内容前面加上“用户帐号:”
# cat /etc/passwd |awk -F: '{print"用户帐号:"$1}'

4. 请打印出/etc/passwd 第三个域和第四个域
# awk -F: '{print $3"\t"$4}' /etc/passwd

5. 匹配/etc/passwd 第三域大于100的显示出完整信息
# cat /etc/passwd |awk -F: '{if($3>100) print$0}'

6. 请打印第一域,并且打印头部信息为:这个是系统用户,打印尾部信息为:"================"
# cat /etc/passwd |awk -F: 'BEGIN{print "这个是系统用户"} {print $1} END{print "================"}'

7. 打印行号小于15的,并且最后一域匹配bash的信息.
# cat /etc/passwd |awk -F: '{if($NR<15 && $NF~/bash/) print$0}'

8. 请打印出第一域匹配daemon的信息.
# cat /etc/passwd |awk -F: '$1=="daemon"'

10. 请打印出第三域数字之和
# cat /etc/passwd |awk -F: '{sum=sum+$3}END{print sum}'
# cat /etc/passwd |awk -F: '{sum=sum+$3};END{print sum}'

11. 请将/etc/passwd 中的root替换成gongda,记住是临时替换输出屏幕看到效果即可.
# cat /etc/passwd |awk -F: 'gsub(/root/,"gongda") {print $0}'

12. 请匹配passwd最后一段域bash结尾的信息,有多少条
# awk -F: '($NF~/bash/){print NR}' /etc/passwd |wc -l
# cat /etc/passwd |awk -F: '{if($NF~/bash/) print$0}'|wc -l
13. 请同时匹配passwd文件中,带mail和bash的关键字的信息
# cat /etc/passwd |awk -F: '$0~/root|mail/'
# awk -F: '{if($0~/mail/ || $0~/bash/) print $0}' /etc/passwd

14. 请匹配passwd第三域总大于500的相关信息.
# cat /etc/passwd |awk -F: '{if($3>500) print $0}'
 
15.编写文件file的内容如下:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
其中:
Mike Harrington 名字
[510] 548-1278  电话
250:100:175     过去三个月里的捐款

(1)显示所有电话号码
# awk -F: '{print $2}' file

(2)显示Dan的电话号码
# awk -F: '{if($1~/Dan/) print$2}' file 

(3)显示Susan的名字和电话号码
# awk -F: '{if($1~/Susan/) print$1,$2}' file 

(4)显示所有以D开头的姓
# awk -F: '{if($1~/^D/) print$1}' file 

(5)显示所有以一个C或E开头的名
# awk -F: '{if($1~/^[C|E]/) print$1}' file

(6)显示所有只有四个字符的名,这里可以使用length函数,举例: length($1)==10 $1字符为10
# cat file |awk -F: '{print$1}'|awk '{if(length($1)==4) print $1}'

(7)显示所有区号为916的人名
# cat file |awk '{print$2}'|awk -F: '{if($2~/916/) print$1}'

(8)显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
# cat file |awk -F: '{if($1~/Mike/) print "$"$3"$"$4"$"$5}'

(9)显示姓,其后跟一个逗号和名
# cat file |awk -F: '{print$1}'|awk '{print$2","$1}'

练习3 – 排序例子


@@@@
【awk 之 asort 与 asorti 数组排序区别及演示-ontherd-ChinaUnix博客】
http://m.blog.chinaunix.net/uid-21374062-id-3189744.html

比如你有以下文件infile:
a,b,c,d,e,f
a,e,c,d,e,f
a,e,g,d,e,f
a,f,c,d,e,f
a,a,c,d,e,f
你想按第二列进行排序:
awk 'BEGIN{
    FS=","
}
{
    ary[$2,NR]=$0
}
END{
    nrw=asorti(ary, newary)
    for(i=1;i<=nrw;i++)
        print ary[newary[i]]
}' inputfile
a,a,c,d,e,f
a,b,c,d,e,f
a,e,c,d,e,f
a,e,g,d,e,f
a,f,c,d,e,f
@@@@

sort

110,1|1,10 
110,1|2,101 
110,3|1,103 
110,4|1,16 
110,5|1,12 
112,1|1,10 
112,1|2,101 
112,2|1,103 
110,6|1,11 
104,2|1,34 
112,3|1,103 
112,4|1,16 
112,6|1,11 
113,1|1,30 
110,2|1,103 
112,5|1,12

sort -t , -k 1n -k 3rn file.txt
1.-t 指定文本分隔符
2.-k 指定排序列
3.-n 按数字进行排序
4.-r 翻转排序结果 
104,2|1,34 
110,2|1,103 
110,3|1,103 
110,1|2,101 
110,4|1,16 
110,5|1,12 
110,6|1,11 
110,1|1,10 
112,2|1,103 
112,3|1,103 
112,1|2,101 
112,4|1,16 
112,5|1,12 
112,6|1,11 
112,1|1,10 
113,1|1,30

结果说明:
上面的例子为按第一行正排序,按第三行反排序;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值