已整理-awk文本处理命令

目录:

  1、awk功能

  2、常用awk内置变量

  3、awk正则匹配

  4、BEGIN和END语句块

  5、awk数组

  6、awk流程控制

  7、awk 引用外部变量

  8、awk常用使用案例

 

1、awk功能
通过一个简短的命令,我们来了解其工作原理:

# awk '{print $0}' /etc/passwd 
# echo hhh|awk '{print "hello,world"}' 
# awk '{ print "hiya" }' /etc/passwd

你将会见到/etc/passwd文件的内容出现在眼前,现在,解释 awk做了些什么;

调用awk时,我们指定/etc/passwd作为输入文件,执行awk时,它依次对/etc/passwd中的每一行执行print命令,所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd完全相同;
现在,解释{ print }代码块,在awk 中,花括号用于将几块代码组合到一起,这一点类似于C 语言,在代码块中只有一条 print命令;
在awk 中,如果只出现print命令,那么将打印当前行的全部内容,再次说明,awk 对输入文件中的每一行都执行这个脚本;

 

 

 

 

2、常用awk内置变量

 

 

$0          当前记录 
$1~$n       当前记录的第n个字段 
FS          输入字段分隔符,默认是空格 
RS          输入记录分割符,默认为换行符 
NF          当前记录中的字段个数,就是有多少列 ,重点
NR          已经读出的记录数,就是行号,从1开始 ,重点
OFS         输出字段分隔符,默认也是空格 
ORS         输出的记录分隔符,默认为换行符 

 

# awk -F: 'BEGIN{OFS="#"}$1=="root"{print $1,$2,$3}' /etc/passwd    #输出$1=="root"的行,且把空格改为#连接
root#x#0

 

3、awk正则匹配

 

 

 

 示例:

# awk -F: '/^root/{print}' /etc/passwd               #以root开头的
# awk -F: '$1!~/root/{print}' /etc/passwd            #$1包含root字符串的

 

4、BEGIN和END语句块

通常对于每个输入行,awk都会执行每个脚本代码块一次; 然而,在许多编程情况中,可能需要在awk开始处理输入文件中的文本之前执行初始化代码;
对于这种情况,awk允许您定义一个BEGIN 块. 因为awk在开始处理输入文件之前会执行BEGIN块;
因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk还提供了另一个特殊块,叫作 END块,awk在处理了输入文件中的所有行之后执行这个块;
通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

语法格式:

# awk -F: 'BEGIN{语句块}{print}END{语句块}' /etc/passwd

 

# awk 'BEGIN {print "haha"} {print $11} END {print "hoho"}' /var/log/secure        #输出指定的内容前后,输出指定的内容
# awk 'BEGIN {a=100;print a} {print $11} END {print "hoho"}' /var/log/secure    #还可以定义变量

# awk 'BEGIN{x=0}{x++}END{print x}' txt                #输出的x值,取决于txt文本文件的行数

# awk -F: 'BEGIN{i=0;print "User\t\t\tUID\t\tHome"}{print $1"\t\t\t"$3"\t\t"$6;x++}END{print "Total:"NR}' /etc/passwd        #自定义表头和表尾,输出自定义内容

 

 

5、awk数组
数组可以使用一个数组名称存储多个值,与普通变量不一样;
定义格式:数组名[下标]=值

# awk 'BEGIN{a[0]=100;print a[0]}'
# awk 'BEGIN{a[0]=100;a[1]=200;a[2]=300;for(i in a) print a[i] }'    #结合for循环,循环下标

 

6、awk流程控制
if语句:

# awk -F: '{if($3<=1000){i++} } END{print i}' /etc/passwd              #统计用户UID<=1000的用户,逐行处理
# awk -F: '{if($3<=1000){i++}else{j++} } END{print i,j}' /etc/passwd        #双分支

 

for语句:

# awk '{a[$1]++ END{for(i in a ){print i,a[i]}}}'    iptxt      #统计iptxt清单中每个IP地址出现的次数,用a[ip地址],也就是IP地址做为下标

 


7、awk 引用外部变量

# awk '{print res_ip," ",$0}' res_ip=$i temp.txt >>result.txt    #awk引用外部变量

 

8、awk常用使用案例

# ab -c 1 -n 50000 http://127.0.0.1/index.html          #每秒50000次的http请求压力测试
# sort -n txt5                             #升序排列,-n表示要比较整个数字,默认只按第1位排
# sort -r -n txt5                           #降序排列,-n表示要比较整个数字,默认只按第1位排
# awk -F '.' '{print $3"\t"$4"\t"$0}' prod_vm_ip.txt |sort -n -k 1 -k 2|awk '{print $3}'>prod_ip.txt    #awk 排序不同网段的IP地址

# uptime | awk '{print "cpu平均负载: "$10,$11,$12}'        #CPU负载
# free -m | awk '/^Mem/{print "主机剩余内存"$4"M"}'        #主机剩余内存
# df -h | awk '/vda1/{print "磁盘剩余空间: "$4}'          #磁盘剩余空间
# ifconfig eth0 | awk '/RX p/{print "网卡eth0接收的数据量是"$5"字节"}'
# awk '{x++}END{print "主机拥有的账户总数是:"x" 个"}' /etc/passwd

 

posted on 2022-10-20 11:22  tengq  阅读(194)  评论(0编辑  收藏  举报

导航