已整理-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 对输入文件中的每一行都执行这个脚本;
$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
示例:
# awk -F: '/^root/{print}' /etc/passwd #以root开头的
# awk -F: '$1!~/root/{print}' /etc/passwd #$1包含root字符串的
通常对于每个输入行,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循环,循环下标
# 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地址做为下标
# awk '{print res_ip," ",$0}' res_ip=$i temp.txt >>result.txt #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