05.awk
# 01.awk作用
**更多详细内容参考:**https://www.cnblogs.com/xiaonq/p/11969744.html
# 1.1 awk作用
- awk是一种编程语言,用于在linux下对文本和数据进行处理
- awk的处理文件和数据处理方式是逐行扫描,寻找到匹配的行,并在这些行上进行你想要的操作
- 如果没有指定处理动作,则把匹配的行显示到屏幕上
# 1.2 awk常用指令
// # 匹配代码块,可以是字符串或正则表达式
{} # 命令代码块,包含一条或多条命令
$0 # 表示整个当前行
$1 # 每行第一个字段
NF # 字段数量变量
NR # 每行的记录号,多文件记录递增
/[0-9][0-9]+/ # 两个或两个以上数字
/[0-9][0-9]*/ # 一个或一个以上数字
-F'[:#/]' # 定义三个分隔符
FNR # 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t # 制表符
\n # 换行符
FS # BEGIN时定义分隔符
RS # 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ # 匹配,与==相比不是精确比较
!~ # 不匹配,不精确比较
== # 等于,必须全部相等,精确比较
!= # 不等于,精确比较
&& # 逻辑与
|| # 逻辑或
+ # 匹配时表示1个或1个以上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 02.awk使用
# 2.1 awk常用指令
cat /etc/passwd |awk -F ':' '{print $1}' # 以冒号为分隔打印第一列数据
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}' # 打印第一列和第七列数据,并以制表符分隔
awk -F ':' '/root/{print $1}' /etc/passwd # 搜索/etc/passwd有root关键字的所有行,只显示第一行
w|awk 'NR==1{print $6}' # 显示第一行第六列的数据
awk -F: 'NR==5 || NR==6{print}' /etc/passwd # 打印第五行和第六行数据
awk '!/mysql/' /etc/passwd # 匹配所有 不包含 "mysql"关键字的行
awk '/mysql|mail/{print}' /etc/passwd # 匹配包含mysql 或者 mail的行
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.2 awk基本语法
tail -n3 /etc/services |awk -F'[ /]+' '{print $2}' # 以"空格"或"斜线"分隔
awk -v a=123 'BEGIN{print a}' # 变量赋值
tail -n3 /etc/services |awk 'BEGIN{print "服务\t\t端口\t\t\t描述"}{print $0}END{print "===结束==="}'
# BEGIN{} END{}结合使用
1
2
3
4
2
3
4
# 2.3 正则匹配
tail /etc/services |awk '/^blp5/{print $0}' # 匹配开头是 blp5 的行
tail /etc/services |awk '/^[a-z0-9]{8} /{print $0}' # 匹配第一个字段是 8 个字符的行
tail /etc/services |awk '/blp5/ && /tcp/{print $0}' # 匹配记录中包含 blp5 或 tcp 的行
awk '! /^#|^$/' /etc/nginx/nginx.conf # 不匹配开头是#和空行
tail /etc/services |awk '/^blp5/,/^com/' # 匹配以 "blp5开头" 到 "com开头" 之间的所有行
1
2
3
4
5
2
3
4
5
# 2.4 NF
echo "a b c d e f" |awk '{print NF}' # 打印行数
echo "a b c d e f" |awk '{print $1}' # 打印第一行
echo "a b c d e f" |awk '{print $NF}' # 打印最后一行
echo "a b c d e f" |awk '{print $(NF-1)}' # 打印倒数第二行
echo "a b c d e f" |awk '{$NF="";$(NF-1)="";print $0}' # 排除最后两个字段
1
2
3
4
5
2
3
4
5
# 2.5 NR
tail -n5 /etc/services |awk '{print NR,$0}' # 打印行号+内容
tail -n5 /etc/services |awk 'NR==3{print $2}' # 打印第三行第二列的值
tail -n5 /etc/services |awk 'NR<=3{print NR,$0}' # 打印前三行
1
2
3
2
3
# 2.6 操作符
'''数字 0,空字符串和未定义的值 '''
seq 3 |awk '{print $0*2}' # 乘法
seq 3 |awk '{print $0/2}' # 除法
seq 5 |awk '$0%2==0{print $0}' # 取余
seq 5 |shuf |awk '{print $0|"sort"}' # 先打乱再排序
1
2
3
4
5
2
3
4
5
上次更新: 2024/3/13 15:35:10