Linux文本三剑客awk经典案例

前言:

AWK是一种专门用于文本处理的编程语言,它被广泛用于数据提取和报告生成,也是企业笔试面试常考的内容,以下34题是awk的用法案例,希望可以帮到你!

1.查看TCP连接状态

[root@node1 ~]# netstat -nat | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print state[key],key}'| sort -nr
7 LISTEN
1 ESTABLISHED

2.查找请求数20个IP(常用于查找攻击源)

[root@node1 ~]# netstat -nalp|awk '/^tcp/ {print $5}'|awk -F: '{print $1}'| sort | uniq -c |sort -nr | head -n 20 
      4 
      3 0.0.0.0
      1 192.168.110.1

3.输出当前系统所有用户的UID:

[root@shell ~]# awk -F: '{print $3}' /etc/passwd
注释:-F:指定分隔符为:$3指定第三段

4.输出当前系统所有用户的UID,在首行加入UserUid:

[root@shell ~]# awk -F: 'BEGIN{print "UserUid"}{print $3}' /etc/passwd

5.输出当前系统shell为/bin/bash的用户名,在最后一行加入END That is last line!!!

[root@shell ~]# awk -F: '$NF=="/bin/bash" {print $1} END {print "That is last line!!!"}' /etc/passwd
root
kxy
fox
That is last line!!! 

6.输出当前系统上GID为0的用户的用户名

[root@shell ~]# awk -F: '$4==0{print $1}' /etc/passwd

7.输出当前系统上GID大于500的用户的用户名

[root@shell ~]# awk -F: '$4>500{print $1}' /etc/passwd

8.输出当前系统上的所有用户名和UID,以“ # # ”为分隔符

[root@shell ~]# awk -F: 'BEGIN{OFS=" # # "} {print $1,$3}' /etc/passwd
[root@shell ~]# awk -F: -v OFS=" # # " '{print $1,$3}' /etc/passwd

9.输出/etc/passwd文件中以“:”为分隔符的最后一段。

[root@shell ~]# awk -F: '{print $NF}' /etc/passwd

10.对/etc/pa;sswd文件中输出的每一行计数

[root@shell ~]# awk '{print NR,$0}' /etc/passwd

11.对/etc/passwd、/etc/fstab文件中输出的每一行分别计数。

[root@shell ~]# awk '{print FNR $0}' /etc/passwd /etc/fstab

12.自定义变量

[root@shell ~]# awk -v var="Linux.com.cn" BEGIN'{print var}'=
Linux.com.cn

13.以printf格式输出用户名,UID、GID

[root@shell ~]# awk -F: '{printf "%-19s %d %10i\n",$1,$3,$4}' /etc/passwd

14.检测当前系统上所有用户,如果用户名为root输出:Admin 如果用户名不为root输出:Common User

[root@shell ~]# awk -F: '{if ($1=="root") printf "%-19s: %s\n", $1,"Admin"; else printf "%-19s: %s\n", $1, "Common User"}' /etc/passwd

15.统计当前系统上UID大于500的用户的个数

[root@shell ~]# awk -F: '{if ($3>=500) sum++} END {print sum}' /etc/passwd

16.读取/etc/passwd文件中的每一行的每一个字段,输出每个字段中字符个数大于等于四的字段。

[root@shell ~]# awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd

17.使用do-while语句输出/etc/passwd中每一行中的前三个字段

[root@shell ~]# awk -F: '{i=1;do {print $i;i++} while(i<=3)}' /etc/passwd

18.使用for语句输出/etc/passwd中每一行中的前三个字段

[root@shell ~]# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd

19.统计/etc/passwd文件中各种shell的个数

[root@shell ~]# awk -F: '$NF!~/^$/{BASHsum[$NF]++}END{for(A in BASHsum){printf "%-15s:%i\n",A,BASHsum[A]}}' /etc/passwd
注释:$NF!~/^$/:最后一个字段非空BASHsum[$NF]++:最后一个字段相同的加一

20.显示当前系统上UID号为偶数的用户名和UID

[root@shell ~] awk -F: '{if($3%2==1) next;{printf "%-19s%d\n",$1,$3}}' /etc/passwd

21.统计当前系统上以tcp协议工作的各端口的状态数

[root@shell ~]# netstat -ant | awk '/^tcp/ {++STATE[$NF]} END {for(a in STATE) print a, STATE[a]}'

22.输出/etc/passwd中的每一行以||||隔开,默认不换行

[root@shell ~]# awk -F: 'BEGIN{ORS="||||"}{print $0}' /etc/passwd
[root@shell ~]# awk -F: -v ORS="||||" '{print $0}' /etc/passwd

23.获取根分区剩余大小

[root@shell ~]# df -h | awk '/\/$/ {print $4}'
15G
[root@shell ~]# df -h | awk '$NF=="/" {print $4}'
15G

24.获取当前机器ip地址

[root@shell ~]# ip a | awk '/ens33$/ {print $2}'
192.168.110.132/24

25.打印/etc/passwd中UID大于500的用户名和uid

[root@shell ~]# awk -F: '$3>500 {print $1,$3}' /etc/passwd
nobody 65534
systemd-coredump 999
polkitd 998
colord 997
clevis 996

26./etc/passwd 中匹配包含root或net或ucp的任意行

[root@shell ~]# awk -F: '/root|net|ucp/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

27.处理以下文件内容,将域名取出并根据域名进行计数排序处理(百度搜狐面试题) test.txt

http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html

[root@shell ~]# cat test.txt
http://www.baidu.com/index.html
http://www.baidu.com/1.html 
http://post.baidu.com/index.html 
http://mp3.baidu.com/index.html 
http://www.baidu.com/3.html 
http://post.baidu.com/2.html
[root@shell ~]# awk -F/ '{print $3}' test.txt | sort -nr | uniq -c
      3 www.baidu.com     
      2 post.baidu.com     
      1 mp3.baidu.com
[root@shell ~]# awk -F/ '{W[$3]++} END {for (k in W) print W[k],k}' test.txt | sort -nr
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com

28.请打印出/etc/passwd 第一个域,并且在第一个域所有的内容前面加上“用户帐号

[root@shell ~]# awk -F: 'BEGIN{print "用户账号:"}{print $1}' /etc/passwd

29.请打印出/etc/passwd 第三个域和第四个域

[root@shell ~]# awk -F: '{printf "%-5s %d\n", $3, $4}' /etc/passwd

30.请打印第一域,并且打印头部信息为:这个是系统用户,打印尾部信息为:“================”

[root@shell ~]# awk -F: 'BEGIN {print "系统用户"} {print $1} END {print "================"}' /etc/passwd

31.请打印出第一域匹配daemon的信息.

[root@shell ~]# awk -F: '$1~/daemon/' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

32.请将/etc/passwd 中的root替换成gongda,记住是临时替换输出屏幕看到效果即可

[root@shell ~]# sed 's/root/gongda/g' /etc/passwd
[root@node1 ~]# awk '{gsub(/root/, "gongda"); print}' /etc/passwd

33.请匹配passwd最后一段域bash结尾的信息,有多少条

[root@shell ~]# awk '/bash$/' passwd | wc -l
3
[root@shell ~]# awk '{ if ($NF~/bash$/) sum++ } END {print sum}' /etc/passwd
3

34.请同时匹配passwd文件中,带mail或bash的关键字的信息

[root@shell ~]# awk '$0~/mail|bash/' passwd
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
kxy:x:1000:1000:kxy:/home/kxy:/bin/bash
fox:x:1001:1001::/home/fox:/bin/bash
fox:x:1001:1001::/home/fox:/bin/mail

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值