文章目录
- 1.语法
- 2.参数
- 3.生命周期
- 4.预定义变量
- 5.处理规则顺序
- 6.输入
- 7.正则表达式
- 8.比较表达式
- 9.算术表达式
- 10.逻辑表达式
- 11.条件表达式
- 12.范围表达式
- 13.流程控制
- 14.练习
- 1、找出/proc/meminfo文件中以s开头的行,至少用三种方式(忽略大小写)
- 2、显示当前系统上的以root,centos或者user开头的信息
- 3、找出/etc/init.d/functions文件下包含小括号的行
- 4、输出指定目录的基名
- 5、找出网卡信息中包含的数字
- 6、找出/etc/passwd下每种解析器的用户个数
- 7、获取网卡中的ip,用三种方式实现
- 8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数
- 9、过滤掉php.ini中注释的行和空行
- 10、找出文件中至少有一个空格的行
- 11、过滤文件中以#开头的行,后面至少有一个空格
- 12、查询出/etc目录中包含多少个root
- 13、查询出所有的qq邮箱
- 14、查询系统日志中所有的error
- 15、删除某文件中以s开头的行的最后一个词
- 16、删除一个文件中的所有数学
- 17、显示奇数行
- 18、删除passwd文件中以bin开头的行到nobody开头的行
- 19、从指定行开始,每隔两行显示一次空行
- 20、每隔5行打印一个空行
- 21、不显示指定字符的行
- 22、将文件中1到5行中aaa替换成AAA
- 23、显示用户id为奇数的行
- 24、显示系统普通用户,并打印系统用户名和id
1.语法
awk [参数] [处理规则] [操作对象]
2.参数
-F : 指定文本分隔符(默认是以空格作为分隔符)
awk -F'f' '{print $NF}' 9.txt
3.生命周期
grep读一行处理一行,直至处理完成。
(sed和awk也是)
1、接收一行作为输入
2、把刚刚读入进来得到文本进行分解
3、使用处理规则处理文本
4、输入一行,赋值给$0,直至处理完成
5、把处理完成之后的所有的数据交给END{}来再次处理
4.预定义变量
$0 : 代表当前行
# 在每行后面加是 ---
[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
$n :代表第n列
# 打印第第一列
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd
NF :记录当前行的字段数
# 查看第一行的列数
[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
7
# 展示最后一行
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
NR :用来记录行号
[root@localhost ~]# awk -F: '{print NR}' /etc/passwd
FS :指定文本内容分隔符(默认是空格)
FS 的优先级要高于 -F
"""
vi 1.txt
a::b::c::d
:wq
"""
[root@localhost ~]# awk 'BEGIN{FS="::"}{print $NF}' 1.txt
d
OFS :指定打印分隔符(默认空格)
[root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
5.处理规则顺序
1.BEGIN{}
2.//
3.{}
4.END{}
6.输入
输出在{}函数中使用.
print : 打印
printf :格式化打印
%s : 字符串
%d :数字
- :左对齐
+ :右对齐
15 : 至少占用15字符
# 格式化输出
[root@localhost ~]# awk -F: 'BEGIN{OFS="|"}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd
| /bin/bash|root |
| /sbin/nologin|bin |
| /sbin/nologin|daemon |
...
7.正则表达式
[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
8.比较表达式
>
<
>=
<=
~ 正则匹配
!~ 正则匹配(取反)
8.1练习1
打印属组ID大于属主ID的行
[root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
8.2练习2
结尾包含bash的行
# 把行尾的字段取出来在做正则匹配
[root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
8.3练习3
结尾不包含bash的行
# 把行尾的字段取出来在做取反的正则匹配
[root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
9.算术表达式
+
-
*
/
%
9.1练习1
属主id号 + 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
9.2练习2
属主id号 * 属组id > 2000
awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
9.3练习3
打印偶数行
[root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
9.4练习4
打印奇数行
[root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
10.逻辑表达式
&& : 逻辑与
|| :逻辑或
! :逻辑非
10.1练习1
属主id号 + 属组id > 2000 $$ 属主id号 * 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
10.2练习2
属主id号 + 属组id > 2000 || 属主id号 * 属组id > 2000
[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
10.3练习3
!(属主id号 + 属组id > 2000)
[root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
11.条件表达式
==
>
<
>=
<=
11.1练习1
打印第三行
[root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd
12.范围表达式
'//,//'
从某个条件开始到某个条件结束.
[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
13.流程控制
13.1if判断
if(){}
if(){}else{}
if(){}else if(){}else{}
[root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "不大于"}}' /etc/passwd
13.2while循环
[root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
13.3for循环
for(i="初始值";条件判断;游标){}
[root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd
14.练习
1、找出/proc/meminfo文件中以s开头的行,至少用三种方式(忽略大小写)
[root@localhost ~]# grep -E '^[sS]' /proc/meminfo
[root@localhost ~]# sed -r -n '/^[sS]/p' /proc/meminfo
[root@localhost ~]# awk '/^[sS]/{print $0}' /proc/meminfo
[root@localhost ~]# grep -iE '^s' /proc/meminfo
2、显示当前系统上的以root,centos或者user开头的信息
[root@localhost ~]# grep -rE '^(root|centos|user)' /etc/
3、找出/etc/init.d/functions文件下包含小括号的行
[root@localhost ~]# grep -E '\(|\)' /etc/init.d/functions
4、输出指定目录的基名
[root@localhost /etc/sysconfig]# pwd | awk -F/ '{print $NF}'
5、找出网卡信息中包含的数字
[root@localhost /etc/sysconfig]# grep -oE '[0-9]+' /etc/sysconfig/network-scripts/ifcfg-ens3[23]
6、找出/etc/passwd下每种解析器的用户个数
{"bash": 10, "sh": 9, "zsh": 1}
数组
[root@localhost /etc/sysconfig]# awk -F: '{arr[$NF]++}END{for(i in arr){print i,arr[i]}}' /etc/passwd
7、获取网卡中的ip,用三种方式实现
[root@localhost /etc/sysconfig]# ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
[root@localhost /etc/sysconfig]# ip a | sed -r -n '/([0-9]{1,3}\.){3}[0-9]{1,3}/p'
[root@localhost /etc/sysconfig]# ip a | awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{if(NR==3){print $2}else{print $2,$4}}'
8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数
[root@localhost ~]# grep -rE 'main' `find /etc/ -name "*.html" -o -name "*.php" | xargs ` | wc -l
9、过滤掉php.ini中注释的行和空行
[root@localhost ~]# yum install php php-devel
[root@localhost ~]# grep -vE '^\ *;|^$' /etc/php.ini
10、找出文件中至少有一个空格的行
[root@localhost ~]# grep -E '\ +' /etc/php.ini
11、过滤文件中以#开头的行,后面至少有一个空格
[root@localhost ~]# grep -E '^#\ +' /etc/fstab
12、查询出/etc目录中包含多少个root
[root@localhost ~]# grep -roE 'root' /etc/ | wc -l
13、查询出所有的qq邮箱
[root@localhost ~]# grep -E '[0-9a-zA-Z-_]+@qq\.com'
14、查询系统日志中所有的error
[root@localhost ~]# grep -E 'error' /var/log/messages
15、删除某文件中以s开头的行的最后一个词
[root@localhost ~]# grep -Ei '^s' 11.txt | grep -oE '[0-9a-zA-Z]+' | xargs | awk '{for(i=0;i<(NF-1);i++){print $i}}'
16、删除一个文件中的所有数学
[root@localhost ~]# sed -r 's/[0-9]//g' 11.txt
17、显示奇数行
[root@localhost ~]# awk -F: 'NR%2==1{print $0}' /etc/passwd
18、删除passwd文件中以bin开头的行到nobody开头的行
[root@localhost ~]# sed -r '/^bin/,/^nobody/d' /etc/passwd
19、从指定行开始,每隔两行显示一次空行
[root@localhost ~]# awk -F: '{if(NR>5){print $0; if(NR%2){print ""}}}' /etc/passwd
20、每隔5行打印一个空行
[root@localhost ~]# awk -F: '{print $0;if(NR%5==0){print ""}}' /etc/passwd
21、不显示指定字符的行
[root@localhost ~]# grep -vE 'g' x.txt
22、将文件中1到5行中aaa替换成AAA
[root@localhost ~]# sed -r '1,5s/aaa/AAA/g' x.txt
23、显示用户id为奇数的行
[root@localhost ~]# awk -F: '$3%2==1{print $0}' /etc/passwd
24、显示系统普通用户,并打印系统用户名和id
[root@localhost ~]# awk -F: '$3>=1000{print $1, $3}' /etc/passwd