awk 命令总结
awk是处理文本的一种编程语言,它可以依次处理文件的每一行,并读取里面的每一个字段。
语法格式
awk [选项] '匹配规则和处理规则 ' [处理文本路径]
#选项
1. -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
2. -v var=value 赋值一个用户定义变量,将外部变量传递给awk
3. -f scripfile 从脚本文件中读取awk命令
4. -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用
#匹配规则:
1. 字符串
2. 正则表达式
#处理规则
1. BEGIN{} : BEGIN是在awk处理文本之前运行
2. // : 使用的匹配规则
3. {} :循环(每次只处理一行数据)
4. END{} :当所有的处理全部执行完毕之后,执行END中的相关操作
变量
$0: 当前行的内容
NR: 行号,每处理完一条记录,NR值加1
NF: 保存记录的字段数(总共保存的列数),$1,$2...$100
FS: 输入字段分隔符,默认空格
OFS:输出字段分隔符
#输出大于5行的所有内容
awk 'NR >5 {print $0}' text.txt
匹配关系表达式
~ 包含
!~ 不包含
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
#显示第二个字段中包含“ia”字符的每条记录
[root@localhost ~]# awk '$2 ~ /ia/ {print $0}' teams.txt
匹配范围
//,// 范围模式由逗号分隔的两组字符组成,从与第一个字符串匹配的记录到第二个字符串的记录
#显示从“Raptors”到 “Celtics”在内的记录
awk '/Raptors/,/Celtics/ {print $0}' teams.txt
#显示第四个字段等于31到第四个字段等于34的记录
awk '$4 == 31 , $4 == 34 {print $0}' teams.txt
条件与循环
##条件##
if (condition)
action
# 判断数字是奇数还是偶数
awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d 是偶数\n", num }'
##循环##
for (initialisation; condition; increment/decrement)
action
# 输出1 - 5 的数字,在执行qwk之前
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
while (condition)
action
# 循环输出数字 1 到 5
awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
示例
使用(或者)分割,并输出第二和第四列
[root@test1 ~]# echo "/dev/sdh1 (data)clean(running)" | awk -F '[(|)]' '{ print $2,$4}' data running
获取url中的的token
echo '{"data":{"password_status":"ok","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwibmlja25hbWUiOiJhZG1pbiIsInJvbGUiOjEsInVzZXJfaWQiOjEsInRpbWVzdGFtcCI6MTY4OTIzNjQ5OS4xNDgzMjN9.BAJohHgDoY_q2PQGGXeiQ7AV6y1qvdBqdkUpSri9I4o","user":{"avatar":"","create_time":"2023-07-13 03:59:18","email":"admin@fiberhome.com","id":1,"last_login_time":"2023-07-13 14:09:50","nickname":"admin","password_expire_time":"2023-10-11 03:59:18","phone":"","role":1,"status":0,"update_time":"2023-07-13 14:59:15","username":"admin"}},"message":{"detail_message":{"info":"OK"},"ret_code":0}}'| awk -F"[\"]" '{for(i=1;i<=NF;i++){if($i~/token/){print $(i+2)}}}'